将pgi编译库与gcc链接器链接起来

时间:2015-11-11 17:24:28

标签: linker undefined-reference openacc pgi

我想知道如何将pgc ++编译代码(blabla.a)与用c ++或g ++ GNU编译器编译的主代码链接起来。 目前链接默认gnu c ++链接器会出现以下错误:  未定义的引用`__pgio_initu'

2 个答案:

答案 0 :(得分:3)

正如之前的人已经指出的那样,PGI在使用pgc++命令时支持G ++名称修改。从这个输出来看,我猜测你是用g ++而不是pgc ++进行链接的。当使用pgc ++作为链接器以便找到PGI库时,我获得了最大的成功。如果这不是一个选项,您可以将可执行文件与pgc++ -dryrun相关联,以获取完整的链接行,并从那里通过-L-l选项以获取相同的库。

答案 1 :(得分:0)

不同的C ++编译器使用不同的name-mangling约定 生成它们向链接器公开的名称,因此成员函数 名称int A::foo(int)将由编译器A作为一个字符串发送到链接器 goobledegook和编译器B作为一个完全不同的goobledegook字符串, 并且链接器无法知道它们引用相同的函数。于是 你不能链接不同的C ++编译器生成的目标文件,除非它们 使用相同的名称 - mangling约定(,很可能甚至不是:name-mangling 只是ABI兼容性的一个方面。)

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

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