【发布时间】:2019-04-29 10:59:12
【问题描述】:
当使用 g++ 和 clang++ 编译和链接时,期望生成的可执行文件在它们的链接方面将被平等链接。
但在某些情况下,clang++ 可执行文件似乎链接到比 g++ 更多的库,尽管传入的参数相同。
这可能会导致功能差异,尤其是对于在加载和卸载时自动执行的动态链接库。
为什么会这样?
【问题讨论】:
当使用 g++ 和 clang++ 编译和链接时,期望生成的可执行文件在它们的链接方面将被平等链接。
但在某些情况下,clang++ 可执行文件似乎链接到比 g++ 更多的库,尽管传入的参数相同。
这可能会导致功能差异,尤其是对于在加载和卸载时自动执行的动态链接库。
为什么会这样?
【问题讨论】:
事实证明 gcc 在 ubuntu --as-needed 中默认启用了一项功能,这会导致 gcc 有效地忽略链接项链中没有引用其符号的任何库
这可以在 gcc 中使用--no-as-needed 标志禁用。或者,您也可以发出 -Wl,--as-needed 作为 clang++ 的第一个选项,以按照 gcc 的方式行事。
【讨论】:
--as-needed 传递给链接器,如果其中没有任何符号被引用,则会导致任何共享> 库被忽略到达库时文件已链接。静态库中对象的链接始终遵循这种“按需”原则,除非被--whole-archive 覆盖。