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

时间:2018-10-05 18:36:39

标签: sqlite g++ linker-errors

我正在创建一个静态库,其中包含一些对象,其中包括一个依赖于sqlite3的对象。这是我的make文件;基本上将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

我的静态库是内置的,但是尝试获取二进制文件时却得到未定义的引用:

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中)未包含在编译中,但在构建静态库时似乎无法强制将其包含在内。

1 个答案:

答案 0 :(得分:2)

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

您有三个选择。

  • 您可以将SQLite对象文件添加到静态库lib_XX.a

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

    < / li>
  • 或者您的库的使用者需要使用-l_XX -lsqlite3链接到库 SQLite。

最后一个选项是最常用的方法,可以使用pkg-config之类的工具来实现自动化。