c++ - 使用 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 用于二进制文件。
解决方案
它取决于 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++ 版本的函数的静态链接副本。
推荐阅读
- python - Pandas 中数字范围的分布
- java - 不同类型的排序及其时间
- exception - 为什么 vxworks 寄存器 r3 在执行前被篡改?
- neo4j - Neo4j:从叶子迭代到父对象并找到共同的子对象
- php - 在 PHP 中回显特定的 JSON 节点
- .htaccess - Cloud9 (C9) AWS EC2 .htaccess 被忽略
- flexbox - Object-fit:在 IE 中修复封面灯箱画廊?
- python - 当程序在 Python 中循环时,如何从列表中的用户获取多个输入以进行打印?
- javascript - 补间/动画threejs相机到顶视图
- android - 谷歌地图中的地址位置