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



我正在尝试重用一个使用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++_代码: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()"的未定义引用(class foo1;会员吧)

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

酒吧__4Foo1

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

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

正确。

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

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

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

是的,但如果你成功了,你会以上述崩溃告终,所以不要开枪。

最新更新