链接错误与我自己的c++库
Link error with my own C++ library
这是我第一次尝试制作一个简单的库。我在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
,您需要在链接器命令中添加您自己的库之后。我认为你可以把它添加到你的共享库的链接,但不确定。
链接器按照您列出的顺序解析库及其引用,因此顺序很重要。
相关文章:
- 没有为自己的结构调用列表推回方法
- 在他自己的方法中,有可能将一个对象取消引用到另一个对象吗
- 在c++中为我自己的基于指针的数组分配内存的正确方法
- C++从对象自己的类中删除对象
- 使用 std::optional,而不是自己的结构
- 子轴围绕父轴而不是他自己的轴旋转
- 这个C++编译器优化(在自身的实例上调用对象自己的构造函数)的名称是什么,它是如何工作的?
- C++ 如何为自己的迭代器类从迭代器转换为const_iterator?
- 重载 + 自己的类和 std::string 的运算符
- 类无法访问自己的私有静态 constexpr 方法 - Clang bug?
- 是否可以在不填充自己的参数的情况下将模板函数作为参数传递?
- 如何访问模板参数自己的模板参数?
- 将矩阵乘以我自己的输入的向量
- 您应该在什么时候创建自己的异常类型
- 派生类是从基类继承 v 指针并仅使用它,还是也有自己的 v 指针?
- string1 == string2 和你自己的 for 循环比较有什么区别?
- 如何正确包含我自己的标头?
- 自己的自定义向量类. 内存重新分配
- 如何使用我构建的库,而不会从源代码出错,但不为我自己的项目编译?
- 如何使用ZeroMQ为协议缓冲区编写自己的RPC实现