0

我正在尝试重用使用 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 可以读出符号。匹配的符号以不同的方式命名:

酒吧__4Foo1

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

4

1 回答 1

0

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

正确的。

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

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

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

有,但如果你成功了,你最终会遇到所说的崩溃,所以不要把你的脚踢飞。

于 2013-08-10T03:30:30.407 回答