我想知道如何将 pgc++ 编译代码 (blabla.a) 与使用 c++ 或 g++ GNU 编译器编译的主代码链接起来。目前与默认 gnu c++ 链接器链接会出现如下错误: undefined reference to `__pgio_initu'
2 回答
正如前面的人已经指出的,PGI 在使用pgc++
命令时支持 G++ 名称修改。从这个输出来看,我猜你正在链接 g++ 而不是 pgc++。在使用 pgc++ 作为链接器以便它找到 PGI 库时,我取得了最大的成功。如果这不是一个选项,您可以链接可执行文件pgc++ -dryrun
以获取完整的链接行,然后从那里通过-L
and-l
选项来获取相同的库。
不同的 C++ 编译器使用不同的名称修改约定来生成它们向链接器公开的名称,因此int A::foo(int)
编译器 A 将成员函数名称作为 goobledegook 的一个字符串发送给链接器,而编译器 B 作为完全不同的字符串发送给链接器goobledegook,链接器无法知道它们引用的是相同的函数。因此,您不能链接由不同 C++ 编译器生成的目标文件,除非它们使用相同的名称修饰约定(甚至很可能不会:名称修饰只是ABI兼容性的一个方面。)
话虽如此,根据该文档,PGC++ 支持与 g++ 的名称修改兼容性三年半前,前提是 PGI C++ 编译器是使用命令pgc++
或pgcpp --gnu
. 您正在处理的库可能不是以这种特定方式构建的,或者可能是使用较旧的 PGI C++ 编译器构建的。
无论如何,如果 g++ 编译你的头文件blabla.a
并发出与 中的不同的符号blabla.a
,你不能将 g++ 代码与blabla.a
. 您需要blabla.a
使用 g++ 进行重建,这可能不是一个选择。