这是我第一次尝试制作一个简单的库。我在 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'
最佳答案
您可以将 -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
从编译器获取几乎所有警告,这非常有用。
附言。不要调用你的程序 test
,它是一个内置的 shell(和标准的 /usr/bin/test
)。使用其他名称。
关于c++ - 与我自己的 C++ 库的链接错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16084847/