我在Linux,Eclipse CDT,g ++和Boost库中工作。有了使用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库?
答案 0 :(得分:24)
对于pthread_mutex_init,您希望使用-pthread选项编译/链接:
g++ -static -pthread -o"MyProgram" ./main.o -lboost_thread
问题是像pthread_mutex_init这样的函数位于一个单独的库中。动态库可以包含它需要单独库的事实的元数据(因此libboost_thread.so包含它需要libpthread的事实)。
但静态库没有这些信息。因此,当您静态链接时,需要提供对任何必要库的引用。
至于使用-pthread
而不是-lpthread
,它稍微有点优选,因为它不仅链接了必要的库,还提供了应该使用的任何其他选项(例如-D_REENTRANT
编译器)。
答案 1 :(得分:2)
尝试将-lpthread
添加到您的调用中。
答案 2 :(得分:2)
在Linux上,动态库可能会自动依赖其他动态库,因此当您链接它时,您可以免费获得其他库。静态链接时,没有这样的系统,您必须手动指定其他库。