2013-04-18 2 views
1

Это моя первая попытка создать простую библиотеку. Я работал в Ubuntu 12.04 с g ++ 4.6.3. Здесь проблема:Ошибка связи с моей собственной библиотекой C++

[[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, который содержит только основной(). Я положил 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' 

ответ

2

Вы можете связать в общей библиотеке с

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

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

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

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

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

Прочитать Program Library HowTo.

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

+0

Благодарим вас за ввод. Ваш ответ такой же правильный, как у Закинстера. Но я бы согласился с ним, так как он ответил немного раньше, чем вы. постскриптум все имена в моем примере являются поддельными, но спасибо за указание, что тест - это встроенная оболочка. – GuLearn

+0

Вы могли бы поддержать мой ответ .... –

+0

Спасибо, что указали, что я могу связать sqlite3 при компиляции библиотеки! – GuLearn

2

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

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

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

+0

Большое вам спасибо! – GuLearn

0

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

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

Смежные вопросы