链接错误与我自己的C ++库

时间:2013-04-18 13:51:07

标签: c++ dynamic-library

这是我第一次尝试制作一个简单的库。我使用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'

3 个答案:

答案 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来获取编译器的几乎所有警告,这非常有用。

阅读Program Library HowTo

PS。不要将您的程序test称为shell内置程序(以及标准/usr/bin/test)。使用其他名称。

答案 2 :(得分:0)

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

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