【问题标题】:Linking statically only boost library G++ [duplicate]仅静态链接提升库 G++ [重复]
【发布时间】:2013-01-30 13:36:44
【问题描述】:

可能重复:
Can I mix static and shared-object libraries when linking?

我想编译我的应用程序,只静态链接 boost_system 库。其他(glibc 等)应动态链接。我该怎么做?

我的动态编译命令:

g++  -o newserver  server.cpp ... -lboost_system -std=c++0x

静态编译命令:

g++ -static  -o newserver  server.cpp ... -pthread -lboost_system -std=c++0x

但是这个命令是静态链接的!并且应用的重量增加了 2mb!

你能告诉我什么命令只静态编译boost lib吗?

谢谢!

【问题讨论】:

  • @us2012 抱歉,我编辑了关于我的问题的主题

标签: c++ linux g++ static-linking


【解决方案1】:

将-lboost_system 替换为-Wl,-Bstatic -lboost_system -Wl,-Bdynamic。 -Wl 选项按照它在命令行中出现的顺序将它后面的东西发送到链接器。

【讨论】:

  • 不要 -Bstatic 和 -Bdynamic 做同样的事情吗?
  • 不确定 -Bstatic - 我认为编译器无法识别,因此传递给链接器,这将起作用。但正式地,您将 -Wl 用于“链接器命令”。
  • @MatsPetersson 感谢您的回答,但我有一个错误/usr/bin/ld: invalid BFD target 'static'。如何解决这个问题?
  • @MatsPetersson 我认为区别在于-Wl,... 直接将命令传递给链接器,因此您必须知道系统使用的任何链接器的命令,但-Bstatic 传递了任何适当的命令为此,实际使用的链接器。 (例如,在 Solaris 下,通常使用系统链接器,而不是 GNU 链接器。)
  • @JamesKanze 我知道你已经有一段时间没有在这里发表评论了,但是-Bstatic 和-Bdynamic 不会做同样的事情。 '-Bstatic 告诉 ld 不 链接共享库(在支持此的系统上,即支持共享库的系统上)。而-Bdynamic 指示 ld 链接到共享库(这是支持它们的系统上的默认设置)
【解决方案2】:

有两种解决方案。您可以指定-Bstatic 和 -Bdynamic 在命令行中,每个都会影响所有 跟随它的图书馆。或者你可以安排它 您要链接的库的静态版本 静态存在于之前搜索过的目录中 包含动态版本的目录。这允许 你做出某种全球性的决定:你创造 目录一次,所有用户都为它执行-L -Lgeneral 会使用静态版本。

在实践中,我想不出你想要链接的情况 Boost库不是静态的,所以最简单的 解决方案可能只是删除 .so 文件。唯一一次 g++ 将做出决定(并考虑到-Bstatic 和-Bdynamic) 是如果它在同一目录中找到两者。它 按给定顺序搜索目录,并在找到时 具有静态或动态版本的目录 图书馆,它停止了。如果只有一个版本, 无论如何,它都使用那个。

【讨论】:

  • “在实践中,我想不出你想要静态链接 Boost 库的情况”如果你有多个应用程序都运行在相同的目标设备和二进制大小上怎么办?是一个约束?您需要使用共享库来减小应用程序的整体大小。
猜你喜欢
  • 2015-01-28
  • 2012-12-17
  • 2011-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-11
相关资源
最近更新 更多