g ++ vs gcc,将问题与静态库链接(.a)

时间:2011-04-04 10:52:21

标签: gcc static g++

我正在尝试将静态库(.a)文件与.o文件链接,该文件应该使用库中的符号。但是,使用gcc时 - 无论使用.a文件作为

,都会出现正常的链接器错误

gcc -L。 a.c staticlib.a

然而,同样的命令可以完美地与g ++一起使用。

为什么会这样?

我可以看到.c文件是完全合法的c(因此是c ++),但是为什么gcc不能检测到库中的符号?

尝试使用objdump在库中找到符号,能够找到非常相似的符号,但不是精确符号。 e.g:

GOT 00000000000000b0 g F .text 000000000000004e _ * Z15PhttsFn_InitTTSPh * 符号* PhttsFn_InitTTS *

有人可以解释一下这种现象吗?我还检查了编译库文件的架构,它与我的架构相同。

谢谢!

1 个答案:

答案 0 :(得分:3)

C ++使用名为mangling的东西,为了命名空间,重载函数名等,在编译对象文件中获取唯一符号。

您的C代码明确引用符号PhttsFn_InitTTS。现在,如果编译为C,它将生成该符号名称。但是,由于C ++需要处理同名的所有这些不同变体(例如重载,使用不同的参数列表),因此会创建一个“受损”版本编码命名空间和参数类型。在你的情况下它被修改为Z15PhttsFn_InitTTSPh,基本上没有命名空间和没有参数。 (我认为Z15表示15个字符的名称;后面没有参数列表。)

根据文件扩展名gcc - > C,.c.cc等调用GCC .cpp,可以选择文件格式本身 - &gt ; C ++)。将其作为g ++调用强制C ++模式。

你的.a文件显然是使用C ++编译的,因为它暴露了那个受损的符号。