混用对象文件时的兼容性注意事项
混用具有不同版本或选项设置的相同编译器生成的对象文件
使用不同编译器编译的大多数对象文件都可以链接在一起。 但是,某些对象文件不兼容并且限制为链接在一起。 您必须重新编译源代码以获取兼容的对象文件。

在 XL C/C++ V11.1中,改进了 threadprivate 数据 (即 OpenMP threadprivate 变量) 的实现。 使用操作系统线程本地存储器代替了运行时实现。 新的实现可以提高某些应用程序的性能。
如果您计划将使用 11.1 之前的级别编译的对象文件 .o 与使用 IBM® XL C/C++ for AIX® 16.1编译的对象文件进行混合,并且在旧对象文件和新对象文件中都引用了相同的 OpenMP 线程专用变量,那么不同的实现可能会导致不兼容性问题。 可能出现链接错误、编译时错误或其他未定义的行为。 要支持与先前版本的兼容性,可以使用
-qsmp=noostls 子选项来切换到旧实现。 您可以使用缺省子选项
-qsmp=ostls 重新编译整个程序以获取新实现的优点。
> nm oldfiles.o
...
._xlGetThStorageBlock U -
._xlGetThValue U -
...在以上示例中,如果找到了 _xlGetThStorageBlock 或 _xlGetThValue,那么这意味着对象文件包含旧实现。 在这种情况下,必须使用
-qsmp=noostls;否则,请使用缺省子选项
-qsmp=ostls。
如果在编译期间使用了 -qipa 选项,请勿将使用不同编译器版本编译的对象文件和库文件混合在一起。 -qipa 选项会指示编译器对这些对象文件和库文件执行 IPA 链接。 IPA 链接可能无法处理不匹配的版本。
如果对象文件由不同对象模型编译,那么在 -qobjmodel 选项生效的情况下,这些对象文件将无法链接在一起,并且必须重新进行编译。 -qobjmodel 选项将结构、联合和
类
使用的对象模型设置。 不同对象模块之间不兼容。
混用具有不同前端的相同编译器生成的对象文件
IBM XL C/C++ for AIX 16.1 提供了两个前端,一个是基于XL的前端, 由xlc/xlc++ 调用,另一个是基于Clang的前端, 由xlclang/xlclang++ 调用。关于基于XL的前端和基于Clang的前端的说明,请参阅二合一编译器:基于Clang的前端和基于XL的前端。对于 C 源,当源文件中的符号名称仅包含基本字符集中的美元符号或字符时,由 xlc, xlc + +, xlclang和 xlclang + + 生成的对象文件直接兼容。 对于 C++ 源代码, xlc + + 和 xlclang + + 生成的对象文件不直接兼容,因为基于 XL 和基于 Clang 的前端使用不同的 C++ 标准库,运行时和对象模型,因此符号修饰的名称不同。
- 使用 xlc, xlc + +, xlclang和 xlclang + + 中的任何一个进行编译时 C 源的简单标识
- 使用 xlc + + 编译时, C++ 源的名称中包含 __ 后缀的简单标识
- 使用 xlclang + + 编译时, C++ 源的名称以 _Z 开头的标识
例如,对于 C 函数 int foo() {return 0;},当使用 xlc, xlc + +, xlclang和 xlclang + +中的任何一个进行编译时,符号名称为 foo 。 对于 C++ 函数 int foo() {return 0;},当使用 xlc + + 进行编译时,符号名称为 foo__Fv ,当使用 xlclang + +进行编译时,符号名称为 _Z3foov 。
为了使二进制文件兼容,建议您编译源代码并将生成的对象文件与 xlc + + 或 xlclang + +一致链接。
混用不同编译器生成的对象文件
AIX, Linux® (对于大尾数法分发版) 和 Linux (对于小尾数法分发版编译器) 之间不存在二进制兼容性。
Linux 为小尾数法分发版编译器生成的对象与 GCC 生成的对象具有高度的二进制兼容性。
IBM XL C/C++ for AIX 生成的对象文件不能与 GCC 生成的对象文件互操作,后者使用不同的运行时和 C++ 标准库,因此无法混用和匹配 GCC 和 IBM XL C/C++ for AIX 生成的二进制。