我正在开发一个跨越多个不同组织的项目的 redhat 5.2。每个组织都提供已使用各种版本的 g++ 编译的库。目前,这些版本包括 4.1.1、4.1.2 和 4.3.1。我正在尝试使用 4.1.2 将所有库链接到一个可执行文件中。这样做可能会出现什么问题(如果有的话)?顺便说一句,有没有办法判断每个编译器版本构建到哪个 ABI?
5 回答
本ABI政策文档详细说明了不同 ABI 版本之间的兼容性。据此,该libstdc++.so
库应该是兼容的,而 gcc 上一次破坏二进制兼容性是在 3.4。你应该没事。
GCC(GNU Compiler Collection)定义了版本号和兼容性。
4.1.1 和 4.1.2 之间的 G++ 库应该是兼容的;与最新的链接。
4.1.x 和 4.2.x 之间的 G++ 库不兼容;你需要重新编译一些东西。
3.xy 和 4.pq 之间的 G++ 库不兼容;你需要重新编译一些东西。
在您的场景中,使用 4.3.1 构建的代码与其余代码不兼容。
要么您必须重新编译当前使用 4.3.x 编译的代码,因此它使用 4.1.x,或者您需要重新编译当前使用 4.1.x 编译的代码,因此它使用 4.3.x。
也许静态链接可执行文件更容易......制作一个大二进制文件,但可以在所有平台上运行。
链接从不同版本的 g++ 构建的库应该没有问题,除非它们已在 g++ 网站上列出。但重要的是这些库构建在同一平台上,在您的情况下是 redhat 5.2。为 linux/redhat(比如 solaris)以外的平台构建的库不会与您的 exe 链接。
IIRC,有一个 C++ 兼容性库可以做到这一点。我认为它被称为libstdc++-compat。