我想知道如何将pgc ++编译代码(blabla.a)与用c ++或g ++ GNU编译器编译的主代码链接起来。 目前链接默认gnu c ++链接器会出现以下错误: 未定义的引用`__pgio_initu'
答案 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
,这可能不是一个选项。