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

Link error with my own C++ library

本文关键字:c++ 自己的 我自己 错误 链接      更新时间:2023-10-16

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

[[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。在。/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可以从编译器获得几乎所有的警告,这是非常有用的。

阅读程序库HowTo

p。不要将您的程序命名为test,这是一个shell内置程序(和标准的/usr/bin/test)。

如果你的库引用了sqlite3,你应该在链接库之后再链接sqlite:

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

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

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

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