14

我正在使用 Boost 库在 Linux、Eclipse CDT、g++ 中工作。拥有使用 Boost 线程的现有程序,我尝试静态链接它而不是动态链接。/usr/local/lib 目录包含以下文件:

libbost_thread.a
libbost_thread.so
libbost_thread.1.41.0

动态链接工作:

g++  -o"MyProgram"  ./main.o   -lboost_thread

静态链接:

g++ -static -o"MyProgram"  ./main.o   -lboost_thread

产生大量消息,例如:

对“pthread_mutex_init”的未定义引用

如何静态链接到 Boost 库?

4

3 回答 3

25

对于 pthread_mutex_init,您希望使用 -pthread 选项进行编译/链接:

g++ -static -pthread -o"MyProgram"  ./main.o   -lboost_thread

问题是像 pthread_mutex_init 这样的函数在一个单独的库中。动态库可以包含元数据,因为它需要单独的库(因此 libboost_thread.so 包含它需要 libpthread 的事实)。

但是静态库没有这些信息。因此,当您静态链接时,您需要提供对任何必要库的引用。

至于使用-pthread而不是-lpthread,它稍微好一点,因为它不仅链接了必要的库,而且提供了应该使用的任何其他选项(例如-D_REENTRANT编译器)。

于 2010-02-27T17:12:44.063 回答
2

尝试添加-lpthread到您的调用中。

于 2010-02-27T17:12:13.260 回答
2

在 Linux 上,动态库可能会自动依赖于其他动态库,因此当您链接它时,您可以免费获得其他库。静态链接时,没有这样的系统,您必须手动指定其他库。

于 2010-02-27T17:18:21.857 回答