我的项目目前在 gcc 下编译。它使用Boost、ZeroMQ作为静态.a
图书馆和一些.so
像 SDL 这样的库。我想一路叮当响,但不是现在。我想知道是否可以编译使用的代码.a
and .so
在 gcc 下用 clang 编译的库?
是的,就是你usually可以使用clang
使用 GCC 编译的库(反之亦然,使用gcc
与 CLANG 编译的库),因为实际上它不是编译而是linking http://en.wikipedia.org/wiki/Linker_%28computing%29这是相关的。你可能会不走运并得到不愉快的惊喜。
原则上你可以对版本有一些依赖libstdc++
用于链接相关库(如果它们是用 C++ 编码的)。事实上,这通常并不重要。
In C++, 名称修改 http://en.wikipedia.org/wiki/Name_mangling理论上可能是一个问题(可能存在一些极端情况,甚至两个不同版本之间不兼容)g++
)。同样,在实践中这通常不是问题。
因此,通常您可以将 CLANG(甚至是不同但接近的版本)与 GCC 混合使用,但您可能会遇到不愉快的意外。任何 C++ 编译器(无论是 CLANG 还是 GCC)都应该能够使用以下命令编译和链接整个软件(以及所有库):相同的编译器和版本(这包括相同的C++标准库 https://en.wikipedia.org/wiki/C%2B%2B_Standard_Library 执行)。这就是为什么在发行版中升级编译器是一项繁重的工作:发行版制造商必须确保所有包都能编译良好(而且他们确实会得到惊喜!)。
请注意,libstdc++ 的版本确实很重要。 Clang 和 GCC 社区都在努力使其 ABI 兼容编译器升级,但也存在一些微妙的极端情况。阅读特定的 C++ 标准库实现的文档。这些极端情况可以解释在使用 GCC 8 编译的代码中使用良好的 C++ 库二进制文件(使用 GCC 5 编译)时发生的神秘崩溃。该错误不在库中,但 ABI 演变为不兼容。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)