Makefile 和 gcc 导入 sqlite3 不工作

Makefile and gcc importing sqlite3 not working

简介

我在使用 gcc -l 时遇到困难。

我有一个 Makefile 可以 编译 我的文件或 执行 它们在 qemu 上。我决定创建一个数据库来存储或读取用户凭据。 db reader 文件不在 kernel.c 文件(程序主文件)中,而是在一个名为 recive.c 的单独文件中,该文件随后被导入到 kernel.c 文件中。

当 运行 数据库 reader、recive.c 时,只能通过使用 gcc recive.c -l sqlite3 编译该文件,它运行良好,但是当我试图将 gcc 命令传递给我时生成文件它没有。

结构

这是我的 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 中使用以下命令

错误信息

我正在使用 Linux Mint。 我的终端输出:

[ 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

因此,为了首先构建目标文件,我 运行 以下代码将所有 *.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