代码之家  ›  专栏  ›  技术社区  ›  Kiril Kirov

如何与特定库(g++;libstdc++.so.5和libstdc++.so.6)链接

  •  4
  • Kiril Kirov  · 技术社区  · 14 年前

    g++ 链接器链接到特定的 libstdc++ 库版本?我在的手册页上没有找到任何有用的东西 gcc ,其他问题也没有。

    我的应用程序使用一个特定的共享库,它是用 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 不是一个选择,因为很多原因。静态链接也不是一个选项)。

    1 回复  |  直到 13 年前
        1
  •  5
  •   Rup    14 年前

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

    • 重新编译所有的代码(以及你正在使用的任何其他C++库) -fabi-version=1

    假设你不想尝试这样把事情组合在一起,我想你有两个选择:

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