Linker 将使用G2.95.2构建的库链接到使用GCC4.6构建的对象文件

Linker 将使用G2.95.2构建的库链接到使用GCC4.6构建的对象文件,linker,g++,name-mangling,Linker,G++,Name Mangling,我试图重用一个用LinuxGCC2.95.2构建的旧静态库。我正在使用32位Ubuntu发行版的最新编译器(GCC4.6)。这个库是用C++编写的。我在链接封装在类中的函数时遇到问题 我猜符号的命名已经改变了 : GCC 2.95.3(6.6.1或6.3)和GCC 3.3.5使用不同的C++ ABIS,并有不同的名称修改。因此,不能用GCC 2.95.3构建的C++二进制文件(对象、可执行文件、库)与用GCC 3.3.5构建的二进制文件。 ld的错误输出为: 对“foo1::Bar()的未定义引

我试图重用一个用LinuxGCC2.95.2构建的旧静态库。我正在使用32位Ubuntu发行版的最新编译器(GCC4.6)。这个库是用C++编写的。我在链接封装在类中的函数时遇到问题

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

: GCC 2.95.3(6.6.1或6.3)和GCC 3.3.5使用不同的C++ ABIS,并有不同的名称修改。因此,不能用GCC 2.95.3构建的C++二进制文件(对象、可执行文件、库)与用GCC 3.3.5构建的二进制文件。

ld的错误输出为:

对“foo1::Bar()的未定义引用” (1类;成员栏)

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

Bar_u4foo1

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

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

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

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

是否有方法重命名库文件中的符号

是的,但是如果你成功了,你最终会遭遇上述的车祸,所以不要把你的脚踢出去