Ошибка связи с моей собственной библиотекой C ++

Я впервые пытаюсь сделать простую библиотеку. Я работал в Ubuntu 12.04 с g ++ 4.6.3. Вот проблема:

[[mylib.cpp]]
#include<sqlite3.h>
void Mylib::blahblah() {...}
void Mylib::evenmoreblah() {...}
...

[[mylib.h]]
#include <...>
class Mylib {
...
};

Затем я сделал lib:

 gcc -c -Wall -fpic mylib.cpp
gcc -shared -o libmylib.so mylib.o

Я использовал библиотеку в одном test.cpp, который содержит только main (). Я поместил libmylib.so в ./libdir и скомпилировал с помощью:

 g++ -g test.cpp -o test -lpthread -L/usr/local/lib -lsqlite3 -L./libdir -lmylib

Ошибка, которую я получил:

./libdir/libmylib.so: undefined reference to `sqlite3_close'
./libdir/libmylib.so: undefined reference to `sqlite3_exec'
./libdir/libmylib.so: undefined reference to `sqlite3_free'
./libdir/libmylib.so: undefined reference to `sqlite3_open'

1

Решение

Вы могли бы связать -lsqlite3 в вашу общую библиотеку с

 gcc -shared mylib.o -o libmylib.so -lsqlite3

Если вы сделаете это, вам не нужно явно ссылаться -lsqlite3 к вашей программе, но это не повредит.

и порядок связывания аргументов для вашей программы важен:

 g++ -Wall -g test.cpp -o mytest \
-L./libdir -lmylib -L/usr/local/lib -lsqlite3 -lpthread

он должен перейти от библиотек более высокого уровня к системам более низкого уровня (т.е. системным). И не забывай -Wall получить почти все предупреждения от компилятора, что очень полезно.

Прочитайте Библиотека программ HowTo.

PS. Не звони в свою программу test который является встроенным в оболочку (и стандарт /usr/bin/test). Используйте другое имя.

2

Другие решения

Если ваша библиотека делает ссылки на sqlite3, вы должны связать sqlite после ссылки на вашу библиотеку:

g++ -g test.cpp -o test -lpthread -L/usr/local/lib -L./libdir -lmylib -lsqlite3

Иначе ld не найдет ничего полезного в libsqlite3 до связывания вашей библиотеки и не сможет найти запрошенные символы после этого.

2

Поскольку ваша библиотека использует sqlite3, вам нужно добавить это ПОСЛЕ вашей собственной библиотеки в команду компоновщика. Я думаю, что вы могли бы добавить это и к связыванию вашей общей библиотеки, но не уверены.

Компоновщик разрешает библиотеки и их ссылки в порядке их перечисления, поэтому порядок важен.

0
По вопросам рекламы [email protected]