将使用g 2.95.2构建的库链接到使用gcc 4.6构建的目标文件

时间:2013-08-10 03:10:34

标签: linker g++ name-mangling

我正在尝试重用使用Linux GCC 2.95.2构建的旧静态库。我正在使用32位Ubuntu发行版的最新编译器(GCC 4.6)。该库是用C ++编写的。我在链接到类中封装的函数时遇到了问题。

我猜这些符号的命名已经改变了。

  

http://www.qnx.com/developers/docs/6.3.2/momentics/compatibility/about.html#C++_code:   GCC 2.95.3(来自6.2.1或6.3)和GCC 3.3.5使用不同的C ++ ABI并具有不同的名称修改。因此,您无法将使用GCC 2.95.3构建的C ++二进制文件(对象,可执行文件,库)与使用GCC 3.3.5构建的二进制文件链接起来。

ld的错误输出是:

  

对`foo1 :: Bar()的未定义引用   (班级foo1;会员栏)

使用工具mn可以读出符号。匹配符号以不同的方式命名:

  

Bar__4Foo1

问题:有没有办法重命名库文件中的符号?或者我可以强制ld接受旧的命名格式吗?

1 个答案:

答案 0 :(得分:0)

  

我猜这些符号的命名已经改变了。

正确。

您缺少的是原因的命名已更改,即g ++ 2.95和g ++ 3.3生成的代码是ABI 不兼容的。如果允许您将使用这些编译器编译的两个对象链接在一起,那么您所获得的只是无法解释的崩溃。

通过更改名称修改,GCC开发人员为您节省了调试此类崩溃的麻烦。

  

有没有办法重命名库文件中的符号?

有,但是如果你成功了,你最终会遇到崩溃,所以不要开枪。