我正在尝试重用使用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接受旧的命名格式吗?
答案 0 :(得分:0)
我猜这些符号的命名已经改变了。
正确。
您缺少的是原因的命名已更改,即g ++ 2.95和g ++ 3.3生成的代码是ABI 不兼容的。如果允许您将使用这些编译器编译的两个对象链接在一起,那么您所获得的只是无法解释的崩溃。
通过更改名称修改,GCC开发人员为您节省了调试此类崩溃的麻烦。
有没有办法重命名库文件中的符号?
有,但是如果你成功了,你最终会遇到崩溃,所以不要开枪。