【发布时间】:2016-02-12 21:04:13
【问题描述】:
我想知道如何将 pgc++ 编译代码 (blabla.a) 与使用 c++ 或 g++ GNU 编译器编译的主代码链接。 目前,使用默认 gnu c++ 链接器链接会出现如下错误: 对 `__pgio_initu' 的未定义引用
【问题讨论】:
标签: linker undefined-reference openacc pgi
我想知道如何将 pgc++ 编译代码 (blabla.a) 与使用 c++ 或 g++ GNU 编译器编译的主代码链接。 目前,使用默认 gnu c++ 链接器链接会出现如下错误: 对 `__pgio_initu' 的未定义引用
【问题讨论】:
标签: linker undefined-reference openacc pgi
正如前面的人已经指出的,PGI 在使用pgc++ 命令时支持 G++ 名称修改。从这个输出来看,我猜你正在链接 g++ 而不是 pgc++。在使用 pgc++ 作为链接器以便它找到 PGI 库时,我取得了最大的成功。如果这不是一个选项,您可以使用 pgc++ -dryrun 链接可执行文件以获取完整的链接行,然后通过 -L 和 -l 选项从那里获取相同的库。
【讨论】:
不同的 C++ 编译器使用不同的name-mangling 约定
生成它们向链接器公开的名称,因此成员函数
名称 int A::foo(int) 将由编译器 A 作为一个字符串发送到链接器
goobledegook 的,并被编译器 B 视为完全不同的 goobledegook 字符串,
并且链接器无法知道它们引用的是相同的函数。因此
您不能链接由不同 C++ 编译器生成的目标文件,除非它们
使用相同的名称修改约定(甚至很可能不会:名称修改
只是ABI 兼容性的一方面。)
话虽如此,根据this document,
PGC++ 在 3 年半前支持与 g++ 的名称修改兼容性,前提是 PGI C++ 编译器是使用命令 pgc++ 或 pgcpp --gnu 精确调用的。可能是您使用的库处理不是以这种特定方式构建的,或者可能是使用旧的 PGI C++ 编译器构建的。
无论如何,如果 g++ 编译您的 blabla.a 的标头并发出不同的
blabla.a 中的符号,您不能将 g++ 代码与 blabla.a 链接。
您需要使用 g++ 重建 blabla.a,这可能不是一个选项。
【讨论】: