介紹
使用gcc -l時遇到困難。
我有一個Makefile可以編譯我的檔案或在 qemu 上執行它們。我決定創建一個存盤或讀取用戶憑據的資料庫。db reader 檔案不在 kernel.c 檔案(程式主檔案)中,而是在一個名為 recive.c 的單獨檔案中,該檔案隨后被匯入到 kernel.c 檔案中。
當運行資料庫閱讀器 recive.c 時,只有通過使用gcc recive.c -l sqlite3它編譯該檔案才能很好地作業,但是當我嘗試將該 gcc 命令傳遞給我的 makefile 時,它??卻沒有。
結構
這是我的makefile結構:
編譯器
CC = /usr/bin/gcc
聯結器
LD = /usr/bin/ld
來源
SRC = src
物件
OBJ = obj
編譯器標志
CC_FLAGS = $(INCLUDE) $(DEFINES) -m32 -std=gnu99 -ffreestanding -Wall -Wextra
內核編譯
$(OBJ)/kernel.o : $(SRC)/kernel.c
@printf "[ $(SRC)/kernel.c ]\n"
$(CC) $(CC_FLAGS) -l sqlite3 -c $(SRC)/kernel.c -o $(OBJ)/kernel.o
@printf "\n"
我試過什么
我嘗試在 makefile 中使用以下命令
- -l sqlite3
- -lsqlite3
- -L sqlite3
- gcc src/kernel.c -l sqlite3
Error Information
I am using Linux Mint. My terminal Output:
[ linking... ]
/usr/bin/ld -m elf_i386 -T ./config/linker.ld -nostdlib -o out/Terminal.bin obj/asm/entry.o obj/asm/load_gdt.o obj/asm/load_idt.o obj/asm/exception.o obj/asm/irq.o obj/io_ports.o obj/vga.o obj/string.o obj/console.o obj/gdt.o obj/idt.o obj/isr.o obj/8259_pic.o obj/keyboard.o obj/kernel.o
/usr/bin/ld: obj/kernel.o: na fun??o "loginMain":
kernel.c:(.text 0x252): referência n?o definida para "sqlite3_open"
/usr/bin/ld: kernel.c:(.text 0x26a): referência n?o definida para "sqlite3_errmsg"
/usr/bin/ld: kernel.c:(.text 0x27d): referência n?o definida para "fprintf"
/usr/bin/ld: kernel.c:(.text 0x28c): referência n?o definida para "sqlite3_close"
/usr/bin/ld: kernel.c:(.text 0x2be): referência n?o definida para "sqlite3_exec"
/usr/bin/ld: kernel.c:(.text 0x2d9): referência n?o definida para "fprintf"
/usr/bin/ld: kernel.c:(.text 0x2ef): referência n?o definida para "fprintf"
/usr/bin/ld: kernel.c:(.text 0x2fe): referência n?o definida para "sqlite3_free"
/usr/bin/ld: kernel.c:(.text 0x30d): referência n?o definida para "sqlite3_close"
/usr/bin/ld: kernel.c:(.text 0x323): referência n?o definida para "sqlite3_close"
make: *** [Makefile:49: all] Erro 1
Makefile file
You can find my makefile here: https://pastebin.com/XURDCtcW
uj5u.com熱心網友回復:
好吧,我試圖制作一個有趣的 sqlite 程式,但本次討論的相關部分是 make 檔案,請注意LFLAGS我使用的變數-lsqlite3:
CC = g
CFLAGS = -g -Wno-write-strings
LFLAGS = -lsqlite3
DBAPI = dbApi
EXECT = examiner
TESTR = xtest
UTILZ = utilities
all: $(DBAPI).o $(TESTR).o $(UTILZ).o
$(CC) $(CFLAGS) -o $(EXECT).exe $^ $(LFLAGS)
$(DBAPI).o: $(DBAPI).h
$(TESTR).o: $(TESTR).h
$(UTILZ).o: $(UTILZ).h
%.o: %.cpp
$(CC) $(CFLAGS) -c $<
clean:
$(RM) *.o $(EXECT).exe
所以為了首先構建目標檔案,我運行以下代碼,以便將所有 *.cpp 檔案轉換為具有相同名稱的目標檔案(IE dbApi.cpp 被編譯為 dbApi.o 目標檔案):
%.o: %.cpp
$(CC) $(CFLAGS) -c $<
并從頭檔案中選取它們。然后使用默認值all,我希望出現的每個目標檔案都被添加到最終編譯中成為一個可執行檔案:
all: $(DBAPI).o $(TESTR).o $(UTILZ).o
$(CC) $(CFLAGS) -o $(EXECT).exe $^ $(LFLAGS)
就我而言,這最終應該允許程式執行./examiner.exe。我的 make 檔案中有一些冗余,但它相對簡短而直接。希望這有助于引導您獲得更具體的答案。讓我知道。
~X
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/401100.html
標籤:c linux sqlite gcc makefile
