Can';t链接libsqlite3.a以创建自己的静态库

Can';t链接libsqlite3.a以创建自己的静态库,sqlite,g++,linker-errors,Sqlite,G++,Linker Errors,我正在创建一个静态库,其中包含一些对象,包括一个依赖于sqlite3的对象。这是我的制作文件;它基本上将3个cpp文件编译成对象,将它们放入一个.a库,然后使用这个库获取我的主二进制文件 CPPSRCS := \ $(LIBDIR)/database/active_database.$(SRCEXT) \ $(LIBDIR)/sd_card/sd_card.$(SRCEXT) \ $(LIBDIR)/led/led.$(SRCEXT) OBJS := $(CPPSRCS:.cpp=.o)

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

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
我的静态库已构建,但在尝试获取二进制文件时,我得到了未定义的引用:

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

  • 您可以使用
    ld-r
    执行可重定位链接并生成单个
    .o
    文件,其中包含整个静态库和SQLite

  • 或者,您的库的使用者需要使用
    -l\u XX-lsqlite3
    链接到您的库和SQLite


最后一个选项是最常见的方法,可以通过
pkg config

等工具实现自动化。在链接应用程序时,您需要包含
-lsqlite3
。我最终使用了您的第三种方法&效果非常好。