我可以 link 一个用 clang c++11 编译的对象和另一个用 c++17 编译的对象吗
Can I link an object compiled with clang c++11 with another compiled with c++17
我正在专门寻找 的 clang 答案。如果我用 -std=c++11
编译一个对象,用 -std=c++17
编译另一个对象,它们可以安全链接吗?
Jonathan Wakely 发布的答案对于 Clang 也是正确的。
简单回答:如果您自己编译这两个对象,您选择的-std
选项不会影响最终结果。
大多数给定的 C++ ABI 都由标准库决定。其余的是各种运行时支持,例如异常、编译器内置(实际上可能分派到标准库)等等。 libstdc++
ABI 兼容性是 Clang 的一个明确目标,所以你没问题。
如果您使用相同的编译器版本,-std
选项将更改编译时向代码公开哪些符号。然而,libstdc++ 用于稳定功能的 ABI 是向前兼容的,所以你在这里也可以。
更难回答:你的评论表明你有源代码,但如果你只有目标文件并且只是在做最后的 link,那么很有可能将工作,除非用于构建 std=c++11
对象的 Clang 版本非常旧。 g++
和 libstdc++
作者不遗余力地对符号进行版本化,因此您拥有 link 的东西,但随后以难以诊断的方式失败的可能性基本上为零。 (乔纳森的回答倒数第二段提到了这一点)。
同样,由于 Clang 旨在保持与 libstdc++
的 ABI 的兼容性,因此您应该没问题。还有其他细节,但绝大多数都在 Jonathan 的回答中得到解决,他比我更能解释。
我正在专门寻找 -std=c++11
编译一个对象,用 -std=c++17
编译另一个对象,它们可以安全链接吗?
Jonathan Wakely
简单回答:如果您自己编译这两个对象,您选择的-std
选项不会影响最终结果。
大多数给定的 C++ ABI 都由标准库决定。其余的是各种运行时支持,例如异常、编译器内置(实际上可能分派到标准库)等等。 libstdc++
ABI 兼容性是 Clang 的一个明确目标,所以你没问题。
如果您使用相同的编译器版本,-std
选项将更改编译时向代码公开哪些符号。然而,libstdc++ 用于稳定功能的 ABI 是向前兼容的,所以你在这里也可以。
更难回答:你的评论表明你有源代码,但如果你只有目标文件并且只是在做最后的 link,那么很有可能将工作,除非用于构建 std=c++11
对象的 Clang 版本非常旧。 g++
和 libstdc++
作者不遗余力地对符号进行版本化,因此您拥有 link 的东西,但随后以难以诊断的方式失败的可能性基本上为零。 (乔纳森的回答倒数第二段提到了这一点)。
同样,由于 Clang 旨在保持与 libstdc++
的 ABI 的兼容性,因此您应该没问题。还有其他细节,但绝大多数都在 Jonathan 的回答中得到解决,他比我更能解释。