sqlite - 无法链接到 libsqlite3.a 以创建我自己的静态库

标签 sqlite g++ linker-errors

我正在创建一个包含一些对象的静态库,其中包括依赖于 sqlite3 的对象。这是我的制作文件;它基本上将 3 个 cpp 文件编译成对象,将它们放入 .a lib 中,然后使用这个库来获取我的主要二进制文件

CPPSRCS := \
$(LIBDIR)/database/active_database.$(SRCEXT) \
$(LIBDIR)/sd_card/sd_card.$(SRCEXT) \
$(LIBDIR)/led/led.$(SRCEXT) 

OBJS := $(CPPSRCS:.cpp=.o)

lib/%.o: %.$(SRCEXT)
    $(CXX) $(CXXFLAGS) -c $^ -o $@ -lsqlite3

lib_$(APP).a: $(OBJS)
    $(AR) rcs lib_$(APP).a $(OBJS)

$(APP): lib_$(APP).a 
    $(CXX) $(CXXFLAGS) $(SRCDIR)/$@.$(SRCEXT) -o $(DESTDIR)/$@ lib_$(APP).a

我的静态库是构建的,但是当我试图获取我的二进制文件时,我得到了 undefined reference :
lib_XX.a(active_database.o): In function `database::ActiveDatabase::sqlite_exec_wrapper(std::string, int (*)(void*, int, char**, char**), void*)':
database/active_database.cpp:174: undefined reference to `sqlite3_exec'
database/active_database.cpp:178: undefined reference to `sqlite3_free'
lib_XX.a(active_database.o): In function `database::ActiveDatabase::init_db()':

我可以看到 -lsqlite3 (在/usr/lib 中)未包含在编译中,但我似乎无法在构建静态库时强制包含它。

最佳答案

-lsqlite3编译成目标文件时被忽略,因为没有发生链接。

你有三个选择。

  • 您可以将 SQLite 目标文件添加到您的静态库 lib_XX.a .
  • 您可以执行可重定位链接并生成单个 .o包含整个静态库和 SQLite 的文件,使用 ld -r .
  • 或者您的库的使用者需要链接到您的库和 SQLite,使用 -l_XX -lsqlite3 .

  • 最后一个选项是最常用的方法,可以使用 pkg-config 等工具在一定程度上实现自动化。 .

    关于sqlite - 无法链接到 libsqlite3.a 以创建我自己的静态库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52671510/

    相关文章:

    android - listview onClick 返回错误结果

    c++ - 链接器输出文件属性文件与目标路径不匹配?

    c - 使用 -L 选项后动态链接器给出 "cannot open shared object file: No such file or directory"

    database - 在 Satchmo/Django 项目上使用 Git 的正确方法

    java - 创建的数据库出错

    android - 如何从 Google Drive 下载文件并从中恢复数据库

    c++ - 简单 C++ 程序上的过程入口点错误

    c++ - 复制动态库时 dlclose 崩溃

    linux - 制作-j 8 g++ : internal compiler error: Killed (program cc1plus)

    c++ - 在 VC11 中启用/禁用 SAFESEH?