gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:13:36 25 4
gpt4 key购买 nike

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

[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
...

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

[ 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++ 的系统默认版本相关联:

[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:

[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

这个构建环境配置是否有效?

最佳答案

Anyway, the resulting artifacts appear to be linked with system default version of libstdc++:

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

Is this build environment configuration valid?

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

来自 GCC 6.4.0 的较新 C++ 运行时的片段静态链接到您的二进制文件中,并且在运行时它仅依赖于每个 CentOS 系统都安装的旧 libstdc++.so

这就是 GCC devtoolset 版本的全部意义所在。

关于使用现代编译器编译的 C++ 项目,但链接到过时的 libstdc++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52609269/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com