【问题标题】:How to link with specific library ( g++; libstdc++.so.5 and libstdc++.so.6 )如何链接特定库( g++; libstdc++.so.5 和 libstdc++.so.6 )
【发布时间】:2010-08-31 10:09:23
【问题描述】:

一个简单的问题 - 有没有办法让 g++ 链接器链接到特定的 libstdc++ 库版本?我在gcc/g++ 的手册页中没有找到任何有用的东西,这里的其他问题也没有。

情况是这样——我的应用程序使用了一个特定的共享库,它是用libstdc++.so.5 构建的,我想在RHEL5 上安装和使用它。因此,当我尝试在 RHEL5 机器上构建应用程序时,我收到了警告:

warning: libstdc++.so.5, needed by ..the_shared_library_.. may conflict with libstdc++.so.6

安装compat-libstdc++ rpm 没有帮助,程序在std::string 的析构函数上崩溃,因为无能力。所以,在这台 RHEL5 机器上我有这个:

[root@xxx]# ll /usr/lib/libstd*  
-rwxr-xr-x 1 root root 259532 Aug 21 2006 /usr/lib/libstdc++-3-libc6.2-2-2.10.0.so  
lrwxrwxrwx 1 root root 31 Jul 28 19:35 /usr/lib/libstdc++-libc6.2-2.so.3 -> libstdc++-3-libc6.2-2-2.10.0.so  
lrwxrwxrwx 1 root root 18 Aug 24 15:08 /usr/lib/libstdc++.so.5 -> libstdc++.so.5.0.7  
-rwxr-xr-x 1 root root 733456 Aug 21 2006 /usr/lib/libstdc++.so.5.0.7  

当我制作时

[root@xxxx]# ldd my_exe  
libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x00333000)  
...  
libstdc++.so.5 => /usr/lib/libstdc++.so.5 (0x00ddf000)

这很糟糕,因为我知道这是未定义的行为:/

那么,有没有办法只使用 libstdc++.so.5 来构建我的可执行文件? (由于很多原因,删除libstdc++.so.6 不是一种选择。静态链接也不是一种选择)。

非常感谢!

【问题讨论】:

    标签: linker g++ libstdc++


    【解决方案1】:

    这是ABI versions table; -fabi-version 开关的默认值从 1 更改为 2,同时 g++ 在 3.4 中引入了 libstdc++.so.6。这意味着要链接到旧的 libstdc++ 库,您需要

    • 查找并使用等效的 C++ 头文件,而不是编译器附带的头文件
    • 使用-fabi-version=1 重新编译所有代码(以及您正在使用的任何其他 C++ 库)

    否则,您将面临 ABI 不兼容的风险。我无法准确地告诉您更改是什么,但一般来说,最好尝试使用相同编译器版本编译的所有 C++ 代码。

    假设你不想像这样尝试和破解一些东西,我认为你有两个选择:

    1. 请您的共享库供应商使用您的 GCC 版本为您重新编译库。这可能不是微不足道的,因为 g++ 3.4 引入了一个新的更严格的 C++ 解析器。
    2. 首先询问您的供应商他们用于编译库的 g++ 版本,然后使用该版本编译您自己的代码。 RH 可能会提供 compat-gcc 编译器以及 libstdc++ - 我不记得了。但是,您还需要所有其他库的低级版本以及您正在使用的操作系统提供的 C++ 库,因此在具有正确编译器的旧 Red Hat 版本的 VM 上编译可能是最容易的。

    【讨论】:

    • 好的,我尝试了第一个选项,仍然没有.. 我仍然在那里等待帮助,所以我真的不认为他们会重新编译库。关于第二个 - 我需要在 RHEL5 机器上使用该应用程序,所以我不需要旧的操作系统库,只需要 libstdc++。如果他们告诉我他们使用哪个 gcc 版本来编译 oracle 库(OCCI 10.2.0.3),我将使用 RHEL5 和特定的 gcc 版本制作一个虚拟机。希望这会有所帮助:/感谢您的回复! BR,基里尔
    • 对不起,这没有帮助:-/ 在紧要关头,您可以为 libstdc++.so.5 代码运行一个单独的进程,并使用 IPC 在两者之间传递数据。甚至可以使用较旧的 GCC 编写 C 包装库并将其链接到较新的代码中,因此两者之间没有 C++ 边界,但您必须非常小心那里的库链接顺序。
    • 啊,是的,这真是个好主意!不幸的是,我没有时间为这个问题实现它,但这对其他应用程序真的很有帮助。非常有趣的想法。谢谢!
    • 您好!我只是想告诉你问题已经解决,是的,Rup,你是对的。解决问题的东西只是库的新版本,使用 gcc 3.4.3,而不是 3.2.3(:感谢您的帮助!最好的问候,Kiril Kirov
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-03
    • 1970-01-01
    • 1970-01-01
    • 2021-10-25
    • 1970-01-01
    • 2019-08-16
    相关资源
    最近更新 更多