首页 > 解决方案 > 使用 g++ 构建二进制文件时谁确定 GLIBCXX_version?

问题描述

我正在Centos 6.8上使用G++ 4.9.3构建一个自制的共享库。

这个库使用 boost::interprocess::file_lock 并且boost的版本是1.41.0。

我没有在多个环境中工作。我只是使用一个设备,并且在构建库后我从未更改过构建环境。

当我构建库时,g++ 构建它。但是当我通过链接二进制文件运行它时,它显示 "./a.out: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.15' not found (required by ./libmylib.so)"

所以,我检查了 libstdc++ 支持哪些版本,它显示它不支持高于 3.4.13 的 GLIBCXX。GLIBCXX_3.4.13 是 /usr/lib64/libstdc++.so.6 支持的最新版本。

即使我正在使用设备并且它的 libstdc++ 不支持 GLIBCXX_3.4.15,从我的设备构建的库也需要 GLIBCXX_3.4.15。

即使我使用相同的编译器(g++4.9.3),另一个二进制文件也不需要 GLIBCXX_3.4.15。他们工作得很好。

图书馆如何注意到它应该使用 GLIBCXX_3.4.15?

源代码有区别吗?

编译器是否告诉库,例如“您需要使用 GLIBCXX_3.4.15,因为您在代码中使用了一些特殊语法”?

我想知道谁来决定将哪个版本的 GLIBCXX 用于二进制文件。

标签: c++g++centos6libstdc++

解决方案


它取决于 GCC 的版本、编译器标志和源代码。GLIBCXX_3.4.15只有在程序中使用特定功能时才会引用诸如此类的符号。此特定符号版本的功能列表相当大。您可以使用此命令了解哪些特性是相关的(您必须针对较新的libstdc++ 运行该命令,即 GCC 4.9 附带的那个):

$ readelf -sW libstdc++.so.6 | awk '/@GLIBCXX_3.4.15/{print $8}' \
  | sort -u \
  | c++filt

如果您想libstdc++.so.6使用 Red Hat Enterprise Linux 或 CentOS 附带的未修改版本运行您的程序,您可以使用Developer Toolset(它也作为 Red Hat Enterprise Linux 的支持部分提供。Developer Toolset 通过以下方式避免依赖于较新的符号版本使用旧的(C++98 时代)C++ ABI 并提供不属于特定目标操作系统版本的系统 libstdc++ 版本的函数的静态链接副本。


推荐阅读