簡體   English   中英

Makefile 和 gcc 導入 sqlite3 不起作用

[英]Makefile and gcc importing sqlite3 not working

介紹

使用gcc -l時遇到困難。

我有一個Makefile可以編譯我的文件或在 qemu 上執行它們。 我決定創建一個存儲或讀取用戶憑據的數據庫。 The db reader file isn't in kernel.c file (programs main file) but in a seperated file called recive.c which afterwards is imported to the kernel.c file.

When running the database reader, recive.c, only by compiling that file using gcc recive.c -l sqlite3 it works well but when I tried to pass that gcc command to my makefile it doesn't.

結構

這是我的 makefile 結構:

編譯器

CC = /usr/bin/gcc

linker

LD = /usr/bin/ld

來源

SRC = src

對象

OBJ = obj

編譯器標志

CC_FLAGS = $(INCLUDE) $(DEFINES) -m32 -std=gnu99 -ffreestanding -Wall -Wextra

Kernel 編譯

$(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

錯誤信息

我正在使用Linux Mint 我的終端 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文件

你可以在這里找到我的 makefile: https://pastebin.com/XURDCtcW

好吧,我嘗試制作一個 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

因此,要構建 object 文件,首先我運行以下代碼,以便將所有 *.cpp 文件轉換為具有相同名稱的 object 文件(IE dbApi.cpp 被編譯為 dbApi.o object 文件):

%.o: %.cpp
    $(CC) $(CFLAGS) -c $<

並從 header 文件中選擇它們。 然后使用默認的all ,我希望出現的每個 object 文件都將添加到最終編譯為可執行文件:

all: $(DBAPI).o $(TESTR).o $(UTILZ).o
$(CC) $(CFLAGS) -o $(EXECT).exe $^ $(LFLAGS)

在我的情況下,這最終應該允許程序執行./examiner.exe 我的 make 文件中有一些冗余,但它相對較短且易於遵循。 希望這可以幫助您找到更具體的答案。 讓我知道。

~X

看來您正在制作一個操作系統,因為您提到了 qemu。

您應該在項目中有 sqlite 文件來調用它,或者只是制作一個新的數據存儲文件。 因為您需要在 makefile 中調用它: 您如何實際使用 C 庫?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM