我正在尝试将静态库(.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 *
有人可以解释一下这种现象吗?我还检查了编译库文件的架构,它与我的架构相同。
谢谢!
答案 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 ++编译的,因为它暴露了那个受损的符号。