这是我第一次尝试制作一个简单的库。我使用g ++ 4.6.3在Ubuntu 12.04中工作。这是问题所在:
[[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'
答案 0 :(得分:2)
如果您的库引用了sqlite3,则应在链接库后链接sqlite:
g++ -g test.cpp -o test -lpthread -L/usr/local/lib -L./libdir -lmylib -lsqlite3
否则ld
在链接库之前在libsqlite3中找不到任何有用的东西,之后将无法找到所请求的符号。
答案 1 :(得分:2)
您可以使用
将-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
来获取编译器的几乎所有警告,这非常有用。
PS。不要将您的程序test
称为shell内置程序(以及标准/usr/bin/test
)。使用其他名称。
答案 2 :(得分:0)
由于您的库使用sqlite3
,您需要在链接器命令中添加自己的库。我想你也可以将它添加到你的共享库的链接中,但不确定。
链接器按您列出的顺序解析库及其引用,因此顺序很重要。