首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用现代编译器编译的C++项目,但与过时的libstdc++链接

用现代编译器编译的C++项目,但与过时的libstdc++链接
EN

Stack Overflow用户
提问于 2018-10-02 13:22:31
回答 1查看 2K关注 0票数 9

考虑一下C++项目在Centos 7虚拟机或容器中构建和交付的情况。默认的gccCentos 74.8。为了允许开发人员使用现代C++,将最新版本的gcc (例如6.3)安装到作为CI服务器运行的Centos 7中。这提供了-std=c++14支持。

代码语言:javascript
复制
[builder@f7279ae9f33f build (master %)]$ /usr/bin/c++ -v 2>&1 | grep version
gcc version 4.8.5 20150623 (Red Hat 4.8.5-28) (GCC) 
[builder@f7279ae9f33f build (master %)]$ /opt/rh/devtoolset-6/root/usr/bin/c++  -v 2>&1 | grep version
gcc version 6.3.1 20170216 (Red Hat 6.3.1-3) (GCC) 
export CXX=/opt/rh/devtoolset-6/root/usr/bin/c++
make all -j4
...

这是编译和链接命令的简短示例:

代码语言:javascript
复制
[ 78%] Building CXX object CMakeFiles/ucsdos.dir/src/merge_operator_string.cpp.o
/opt/rh/devtoolset-6/root/usr/bin/c++  -Ducsdos_EXPORTS -I/home/builder/src/dos/libucsdos/./src -I/home/builder/src/dos/libucsdos/./include -I/home/builder/src/dos/libucsdos/build/schema/cpp -I/home/builder/src/dos/libucsdos/build/schema -isystem /usr/local/include  -O2 -g -DNDEBUG -fPIC   -frtti -pedantic -Wall -Wextra -Wcast-align -Wcast-qual -Wctor-dtor-privacy -Wdisabled-optimization -Wformat=2 -Winit-self -Wlogical-op -Wmissing-declarations -Wmissing-include-dirs -Wnoexcept -Wold-style-cast -Woverloaded-virtual -Wredundant-decls -Wshadow -Wsign-conversion -Wsign-promo -Wstrict-null-sentinel -Wstrict-overflow=5 -Wswitch-default -Wundef -Werror -Wno-unused -std=gnu++14 -o CMakeFiles/ucsdos.dir/src/merge_operator_string.cpp.o -c /home/builder/src/dos/libucsdos/src/merge_operator_string.cpp

[ 80%] Linking CXX shared library libucsdos.so
/usr/bin/cmake3 -E cmake_link_script CMakeFiles/ucsdos.dir/link.txt --verbose=1
/opt/rh/devtoolset-6/root/usr/bin/c++ -fPIC -O2 -g -DNDEBUG  -shared -Wl,-soname,libucsdos.so.0 -o libucsdos.so.0.3.23 CMakeFiles/ucsdos.dir/src/c.cpp.o CMakeFiles/ucsdos.dir/src/crdt_2p_set.cpp.o CMakeFiles/ucsdos.dir/src/crdt_pn_counter.cpp.o CMakeFiles/ucsdos.dir/src/errors.cpp.o CMakeFiles/ucsdos.dir/src/merge_index_document.cpp.o CMakeFiles/ucsdos.dir/src/merge_index_segment.cpp.o CMakeFiles/ucsdos.dir/src/merge_operator_string.cpp.o -Wl,-rpath,/usr/local/lib: schema/libschema.a /usr/lib64/librocksdb.so /usr/lib64/libjemalloc.so /usr/local/lib/libgrpc++_reflection.so /usr/local/lib/libgrpc++.so /usr/local/lib/libgrpc.so -ldl -lgrpc++ /usr/lib64/libprotobuf.so -lpthread /usr/lib64/libprotobuf-lite.so 

无论如何,生成的工件似乎与libstdc++的系统默认版本相链接:

代码语言:javascript
复制
[builder@f7279ae9f33f build (master %)]$ ldd libucsdos.so | grep libstdc++.so.6
libstdc++.so.6 => /lib64/libstdc++.so.6 (0x00007f2a4a054000)

很容易发现/lib64/libstdc++.so.6版本是4.8.5

代码语言:javascript
复制
[builder@f7279ae9f33f build (master %)]$ yum whatprovides "/lib64/libstdc++.so.6"
libstdc++-4.8.5-28.el7_5.1.x86_64 : GNU Standard C++ Library
Repo        : @Updates
Matched from:
Filename    : /lib64/libstdc++.so.6

此构建环境配置有效吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-10-02 15:04:22

无论如何,生成的工件似乎与libstdc++的系统默认版本相链接:

是。devtoolset-6-gcc-c++包提供了GCC的自定义版本,它使用一个特殊的链接器脚本,而不是libstdc++.so的动态库。这意味着它生成的二进制文件不依赖于较新的libstdc++.so.6,并且可以在没有安装devtoolset的其他CentOS机器上运行(也就是说,它们只有GCC 4.8中的旧的libstdc++库)。

此构建环境配置有效吗?

是。你所看到的是完全正常的,以及它应该如何工作。

GCC 6.4.0中更新的C++运行时部分静态地链接到您的二进制文件中,并且在运行时它只依赖于每个CentOS系统已经安装的旧libstdc++.so

这就是GCC的工具集版本的全部要点。

票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52609269

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档