【问题标题】:Relationship between GLIBCXX(libstdc++.so.6) and gcc versionGLIBCXX(libstdc++.so.6)与gcc版本的关系
【发布时间】:2017-11-07 02:40:40
【问题描述】:

[情况]

我正在开发一个 c++ 库。我遇到了 GLIBCXX 版本的问题。

之前,我是在版本机GLIBCXX_3.4.22上开发的。

但我的库无法在具有 GLIBCXX_3.4.19 的目标机器上运行。

所以,我将 gcc 版本从 5.2.x 降级到 4.8.x,将 GLIBCXX 版本从 3.4.22 降级到 3.4.19。

它在目标机器上成功运行。

但是我的开发机器(ubuntu)启动失败,因为其他库找不到已经链接到该版本的 GLIBCXX 3.4.22 版本。

所以,我重新安装了 GLIBCXX 3.4.22 但 gcc 版本仍然是 4.8.5。

[问题]

  1. 我在 gcc-4.8.5 上编译的库不使用 GLIBCXX_3.4.22 版本吗?在这种环境下开发好吗(gcc 4.8.5, GLIBCXX_3.4.22)?

  2. linux机器上gcc(compile)版本和GLIBCXX(GLIBC)版本有什么关系。

  3. 在哪里可以查看 gcc 和 GLIBCXX(GLIBC) 之间正确的版本兼容性映射信息?

【问题讨论】:

    标签: c++ linux gcc g++


    【解决方案1】:

    libstdc++(这是 GLIBCXX_* 版本符号的来源)从 GCC 3.4.0 到现在都与 ABI 兼容。

    1. 您的库将在编译时使用来自 libstdc++ 的最新符号版本。编译器版本无关紧要,除了

    2. GCC 5.1 在 libstdc++ 中添加了带有“双 ABI”的 C++11 支持。在 C++11 模式下编译的代码将使用带有 [abi:cxx11] 标记的符号,并且可能无法与未使用 C++11 编译的代码互操作(无论是来自不支持 C++11 的旧编译器,还是设置为使用旧标准)。

    3. https://gcc.gnu.org/onlinedocs/libstdc++/manual/abi.html

    如果您需要构建在旧系统上运行的二进制文件,我建议您在容器内设置旧发行版并在其中构建所有旧库。这样,您的开发系统中的任何新内容都不会泄漏到其中。

    【讨论】:

    • 感谢您的帮助。我错过了对 gcc 编译的理解。我必须同时降级 gcc 和 glibc 版本。
    • @YoonsungLee:您可以并行安装多个 gcc 版本,因此无需降级您的系统库。您也可以针对“虚拟”系统进行编译。 gcc 查看给定的系统目录以找到正确的库。
    • @Klaus 我可以动态更改 gcc。但是,gcc 在编译时是否引用了当前 libversion 上的 GLIBC 库?例如,当我用系统 glibcxx3.4.22 构建 gcc 版本 4.8 时,结果 birnary 无法在系统 lib 版本 glibcxx3.4.19 上运行。这样对吗?我在开发环境中不动态更改系统库时遇到问题,因为系统库被其他程序引用。
    • @YoonsungLee:您可以强制运行时链接器使用特定版本。 stackoverflow.com/questions/13367025/…
    • @Klaus:你的意思是链接到进程?或链接到库文件?如果您的意思是在启动时链接到进程,我不能,因为原始进程是jvm并且库文件是动态加载的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-30
    • 2019-05-04
    • 1970-01-01
    • 1970-01-01
    • 2015-06-05
    • 2018-07-05
    • 1970-01-01
    相关资源
    最近更新 更多