【问题标题】:Why do clang++ and gcc/g++ produce differently linked executables为什么 clang++ 和 gcc/g++ 产生不同链接的可执行文件
【发布时间】:2019-04-29 10:59:12
【问题描述】:

当使用 g++ 和 clang++ 编译和链接时,期望生成的可执行文件在它们的链接方面将被平等链接。

但在某些情况下,clang++ 可执行文件似乎链接到比 g++ 更多的库,尽管传入的参数相同。

这可能会导致功能差异,尤其是对于在加载和卸载时自动执行的动态链接库。

为什么会这样?

【问题讨论】:

    标签: c++ gcc linker clang


    【解决方案1】:

    事实证明 gcc 在 ubuntu --as-needed 中默认启用了一项功能,这会导致 gcc 有效地忽略链接项链中没有引用其符号的任何库

    这可以在 gcc 中使用--no-as-needed 标志禁用。或者,您也可以发出 -Wl,--as-needed 作为 clang++ 的第一个选项,以按照 gcc 的方式行事。

    【讨论】:

    • 更准确地说,gcc 将--as-needed 传递给链接器,如果其中没有任何符号被引用,则会导致任何共享​​> 库被忽略到达库时文件已链接。静态库中对象的链接始终遵循这种“按需”原则,除非被--whole-archive 覆盖。
    猜你喜欢
    • 1970-01-01
    • 2015-11-20
    • 1970-01-01
    • 1970-01-01
    • 2015-09-11
    • 2020-06-22
    • 1970-01-01
    • 1970-01-01
    • 2016-09-12
    相关资源
    最近更新 更多