Я впервые пытаюсь сделать простую библиотеку. Я работал в 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'
Вы могли бы связать -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
). Используйте другое имя.
Если ваша библиотека делает ссылки на sqlite3, вы должны связать sqlite после ссылки на вашу библиотеку:
g++ -g test.cpp -o test -lpthread -L/usr/local/lib -L./libdir -lmylib -lsqlite3
Иначе ld
не найдет ничего полезного в libsqlite3 до связывания вашей библиотеки и не сможет найти запрошенные символы после этого.
Поскольку ваша библиотека использует sqlite3
, вам нужно добавить это ПОСЛЕ вашей собственной библиотеки в команду компоновщика. Я думаю, что вы могли бы добавить это и к связыванию вашей общей библиотеки, но не уверены.
Компоновщик разрешает библиотеки и их ссылки в порядке их перечисления, поэтому порядок важен.