代码之家  ›  专栏  ›  技术社区  ›  Pieter

链接到旧版本的libstdc++

  •  27
  • Pieter  · 技术社区  · 15 年前

    在安装了一个新的构建机器之后,我发现它是用标准的C++库的0.0.10来的。

    -rw-r--r--  1 root root 1019216 2009-01-02 12:15 libstdc++.so.6.0.10
    

    但是,我们的许多目标计算机仍然使用旧版本的libstdc++,例如:

    -rwxr-xr-x 1 root root  985888 Aug 19 21:14 libstdc++.so.6.0.8
    

    显然,ABI在前两个0.0.1中发生了变化,因为试图运行程序会导致

    /usr/lib/libstdc++.so.6: version `GLIBCXX_3.4.9' not found
    

    我尝试显式地安装一个旧版本的gcc,但没有帮助。 升级目标机器是我无法控制的,所以不是一个选项。让我的构建在使用旧libstdc++的机器上工作的最佳方法是什么?

    我在apt缓存中搜索要安装的旧libstdc++版本,但显然没有6的旧版本可用?

    6 回复  |  直到 14 年前
        1
  •  20
  •   Jan    14 年前

    您不需要链接到其他库,需要使用旧版本的编译器。

    看一看 the GNU ABI policy . libstdc++共享库设计为向前兼容。也就是说,如果需要6.0.8版本,可以使用6.0.10版本。在该策略中,您可以从GCC-4.2.0中阅读到,6.0.9是必需的,因此您需要一个GCC-4.1.x。

    简而言之,这就是为什么你的系统只有一个libstdc++.so.6.0.x,你只需要最新版本。

    至于将构建系统设置为只使用特定版本的编译器:确保不能使用标准g++(重命名链接,删除提供链接的包,将其从路径中删除),然后开始挖掘。为我工作。

        2
  •  6
  •   paxdiablo    15 年前

    您可以将所需的共享库与您自己的代码一起发送(例如在子目录中),并将ld_library_path设置为运行应用程序的前兆,以便在该目录中进行首次搜索。

    提供您需要的特定版本意味着用户安装的版本无关紧要。你只需要确保你也提供了所有的依赖。

        3
  •  2
  •   Didier Trosset    15 年前

    已经遇到了。我没有想到比安装一个系统(虚拟化?)使用与目标计算机相同的配置来构建可分发的二进制文件。

        4
  •  1
  •   Pieter    15 年前

    另一种方法是静态链接libgcc和libstdc++,这对我不起作用,但可能有人会发现它很有用。

    GCC有选择权 -static-libgcc 但是,只要使用这个选项就什么也没有实现,因为libstdc++仍然是动态链接的。但是,通过确保gcc只能找到libstdc++的静态版本,就可以实现静态链接。

    ln -s `g++ -print-file-name=libstdc++.a`
    g++ -static-libgcc -L. source.cpp
    

    问题是,boost库是根据更新的libstdc++构建的,所以当程序正确编译时,它会生成运行时错误…

    也许这是可以解决的,如果我重建助推太多,没有尝试过。

    (对于记录,如果使用任何动态加载库的代码,例如 dlopen ,静态链接是不可能的)

        5
  •  1
  •   just somebody    15 年前

    您可以将更新的libstdc++“走私”到客户机系统(到私有区域)并将程序与适当的 -rpath 或者您可以将旧版本的libstdc++安装到您的计算机上。看起来不像你 需要 更新,但无论如何,出于其他原因,这可能是不可能的。

    注意:在freebsd上,libstdc++与编译器耦合(我安装了gcc4.2、4.4和4.5,每个都有自己的libstc++)。尝试安装一个较旧(与客户机系统匹配)版本的gcc,它可能包含您要查找的较旧libstdc++版本。

        6
  •  0
  •   Tom    15 年前

    你试过把它和来源列表放在一起吗?这假设您实际安装了库!

    g++ /usr/lib/libstdc++.so.6.0.8 source1.cpp source2.cpp