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

标签 c++ dynamic-library

这是我第一次尝试制作一个简单的库。我在 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 从编译器获取几乎所有警告,这非常有用。

阅读Program Library HowTo .

附言。不要调用你的程序 test,它是一个内置的 shell(和标准的 /usr/bin/test)。使用其他名称。

关于c++ - 与我自己的 C++ 库的链接错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16084847/

相关文章:

c++ - Qt添加库gstreamer-1.0

java - JNI 应用程序出错

linux - 编译 Lua - 创建 .so 文件?

从 C 库调用 C++ 应用程序代码?

c++ - 正则表达式每两个字符拆分字符串

c++ - 如何找到两个不同坐标系中对应点之间的旋转和平移(变换矩阵)

c++ - 从递归返回 (c/c++)

c++ - LLVM 拒绝编译 C++ 源代码,奇怪的错误

ios - iOS 中的动态库和动态框架有什么区别?

C++ 静态链接共享库