我正在开发 redhat 5.2 的一个项目,该项目跨越多个不同的组织。 每个组织都提供使用不同版本的 g++ 编译的库。 目前,这些版本包括4.1.1、4.1.2和4.3.1。 我正在尝试使用 4.1.2 将所有库链接到一个可执行文件中。 这样做可能会出现什么问题(如果有的话)? 顺便说一句,有没有办法知道每个编译器版本构建到哪个 ABI?
此ABI政策文档详细介绍了不同ABI版本之间的兼容性。 据此,
libstdc++.so
库应该是兼容的,而上次gcc打破二进制兼容性是在3.4。你应该没事的。
GCC(GNU 编译器集合)定义版本号和兼容性。
4.1.1和4.1.2之间的G++库应该兼容;链接到最新的。
4.1.x 和 4.2.x 之间的 G++ 库不兼容;你需要重新编译一些东西。
3.x.y和4.p.q之间的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。