Невозможно создать ссылку на libsqlite3.a, чтобы создать собственную статическую библиотеку. - PullRequest
0 голосов
/ 05 октября 2018

Я создаю статическую библиотеку, которая содержит несколько объектов, включая тот, который зависит от 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 голосов
/ 05 октября 2018

-lsqlite3 игнорируется при компиляции в объектные файлы, поскольку не происходит связывание.

У вас есть три варианта.

  • Вы можете добавить объектные файлы SQLite в свойстатическая библиотека lib_XX.a.

  • Вы можете выполнить перемещаемую ссылку и создать один .o файл, содержащий всю статическую библиотеку и SQLite, используя ld -r.

  • Или пользователи вашей библиотеки должны связаться с вашей библиотекой и SQLite, используя -l_XX -lsqlite3.

Последний вариант является наиболее распространенным подходом и может быть несколько автоматизирован с помощью таких инструментов, как pkg-config.

...