【问题标题】:Can I link an object compiled with clang c++11 with another compiled with c++17我可以将一个用clang c++11编译的对象与另一个用c++17编译的对象链接起来吗
【发布时间】:2019-04-05 06:18:39
【问题描述】:

我正在专门寻找对this question 的铿锵回答。如果我用-std=c++11 编译一个对象,用-std=c++17 编译另一个对象,它们可以安全链接吗?

【问题讨论】:

  • 如果两个对象都使用相同编译器的相同版本编译,那么可能。
  • 可能需要 11 个对象的 17 包装器。
  • 但是如果你的编译器支持 C++17 那你为什么要使用 C++11
  • 如果您不尝试在 11 文件中包含 17 标头应该很好
  • 链接的同一个库?对 C++11 代码的使用有什么限制吗?

标签: c++ c++11 clang c++17 clang++


【解决方案1】:

Jonathan Wakely 发布的here 的答案对于 Clang 也是正确的。

简单回答:如果您自己编译这两个对象,您选择的-std 选项不会影响最终结果。

大多数给定的 C++ ABI 是由标准库决定的。其余的是各种运行时支持,例如异常、编译器内置函数(实际上可能分派到标准库)等等。 libstdc++ ABI 兼容性是 Clang 的明确目标,所以你可以在这里。

如果您使用相同的编译器版本,-std 选项将更改在您编译时哪些符号会暴露给代码。但是,libstdc++ 的稳定功能 ABI 是向前兼容的,所以在这里也可以。

更难的答案:您的 cmets 建议您有源,但如果您只有目标文件并且只是在做最后的链接,那么它很有可能会工作,除非 Clang 的版本曾经构建std=c++11 对象很旧。 g++libstdc++ 作者不遗余力地使用版本符号,因此您拥有链接但随后以难以诊断的方式失败的可能性基本上为零。 (乔纳森的回答倒数第二段提到了这一点)。

同样,由于 Clang 旨在保持与 libstdc++ 的 ABI 的兼容性,所以你应该没问题。还有其他细节,但绝大多数都在乔纳森的回答中得到解决,他比我更能解释它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-09
    • 1970-01-01
    • 2015-10-03
    • 1970-01-01
    • 2014-06-02
    • 2021-02-05
    • 1970-01-01
    相关资源
    最近更新 更多