使用 gcc 链接器链接 pgi 编译库

linking pgi compiled library with gcc linker

我想知道如何 link pgc++ 编译代码 (blabla.a) 以及使用 c++ 或 g++ GNU 编译器编译的主代码。 目前 link 使用默认的 gnu c++ linker 会给出如下错误: 对“__pgio_initu”

的未定义引用

不同的 C++ 编译器使用不同的 name-mangling 约定 生成他们暴露给 linker 的名字,所以成员函数 名称 int A::foo(int) 将由编译器 A 作为一个字符串发送给 linker goobledegook,并被编译器 B 视为完全不同的 goobledegook 字符串, linker 无法知道它们指的是同一个函数。因此 你不能 link object 由不同的 C++ 编译器生成的文件,除非它们 采用相同的 name-mangling 约定( 甚至很可能不会 :name-mangling 只是 ABI 兼容性的一方面。)

也就是说,根据 this document, PGC++ 支持 name-mangling 与 g++ 3-and-half 年前的兼容性,前提是 PGI C++ 编译器是使用命令 pgc++pgcpp --gnu. 可能是您正在处理的库不是以特定方式构建的,或者可能是使用较旧的 PGI C++ 编译器构建的。

无论如何,如果 g++ 编译你的 blabla.a 的 headers 并发出不同的 来自 blabla.a 中的符号,你不能 link g++ 代码与 blabla.a。 您需要使用 g++ 重建 blabla.a,这可能不是一个选项。

正如前面的人已经指出的那样,PGI 在使用 pgc++ 命令时支持 G++ 名称修改。从这个输出来看,我猜你 link 使用 g++ 而不是 pgc++。我在使用 pgc++ 作为 linker 时取得了最大的成功,因此它找到了 PGI 库。如果这不是一个选项,您可以 link 带有 pgc++ -dryrun 的可执行文件以获得完整的 link 行并从那里通过 -L-l 选项以获得相同的库。