我正在尝试重用一个使用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开发人员为您省去了调试此类崩溃的麻烦。
有没有办法重命名库文件中的符号?
是的,但如果你成功了,你会以上述崩溃告终,所以不要开枪。