1

这是我第一次尝试制作一个简单的库。我在 Ubuntu 12.04 中使用 g++ 4.6.3 工作。这是问题所在:

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

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

然后我通过以下方式制作了库:

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

我在仅包含 main() 的单个 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'
4

3 回答 3

2

如果您的库引用了 sqlite3,则应在链接库后链接 sqlite:

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

否则ld在链接你的库之前在 libsqlite3 中找不到任何有用的东西,之后将无法找到请求的符号。

于 2013-04-18T13:53:18.350 回答
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)。使用其他名称。

于 2013-04-18T13:54:14.793 回答
0

由于您的库使用sqlite3,因此您需要在链接器命令中的您自己的库之后添加它。我认为您也可以将其添加到共享库的链接中,但不确定。

链接器按照您列出它们的顺序解析库及其引用,因此顺序很重要。

于 2013-04-18T13:59:57.193 回答