【问题标题】:Trying to statically link Boost尝试静态链接 Boost
【发布时间】:2011-01-21 20:03:48
【问题描述】:

我正在使用 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 库?

【问题讨论】:

  • 这与您之前的问题stackoverflow.com/questions/2328439/boost-static-linking 几乎相同,并且重复的帖子通常是不受欢迎的。
  • @Dirk - 它们是相关的,但绝对不同。上一个问题是如何告诉链接器使用 .a 而不是 .so。这个问题是关于一旦他这样做就会发生的问题。最好发布一个新的相关问题,然后将新问题附加到现有问题上。
  • @Samuel:我已得到纠正,并从您那里了解了 -pthread 链接器选项。谢谢!

标签: linux boost linker static-linking


【解决方案1】:

对于 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 表示-lpthread-pthread 之间的重要区别
  • -static -pthread 谢谢,终于成功了!什么是-pthread?某些特定于增强的或链接器选项?这对我来说似乎是一种魔法,但我需要理解这一点。我还使用 Boost Program Options (-lboost_program_options),我应该使用什么开关来静态链接它?
  • @AlexFarber:-pthread 是一个 gcc 选项。它告诉编译器正确构建线程代码。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-18
      • 2014-10-31
      • 1970-01-01
      • 1970-01-01
      • 2010-10-04
      相关资源
      最近更新 更多