尝试静态链接Boost库

14

我在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

产生大量像这样的错误信息:

undefined reference to `pthread_mutex_init'

我该如何静态链接到Boost库?


这个问题几乎与你之前的问题完全相同https://dev59.com/lnE95IYBdhLWcg3wY9D6,重复发布帖子通常是不被赞同的。 - Dirk Eddelbuettel
2
@Dirk - 它们是相关的,但肯定不同。之前的问题是如何告诉链接器使用 .a 而不是 .so。这个问题是关于一旦他这样做会出现的问题。最好发布一个新的相关问题,而不是在现有问题上添加新问题。 - R Samuel Klatchko
@Samuel:我承认错误,并从你那里了解到了关于“-pthread”链接器选项的知识。谢谢! - Dirk Eddelbuettel
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到编译器)。

2
+1 是指提到了 -lpthread-pthread 之间的重要区别。 - D.Shawley
谢谢,最终成功了!-pthread是什么?是Boost特定的东西还是链接器选项?对我来说它看起来像魔法,但我需要理解这个。 我还使用Boost程序选项(-lboost_program_options),我应该使用哪个开关将其静态链接? - Alex F
@AlexFarber:-pthread是gcc选项。它告诉编译器为线程正确构建您的代码。 - R Samuel Klatchko

2
尝试在调用中添加-lpthread

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接