我已经在 CentOS 7 上安装了
devtoolset-10
软件包并运行 /opt/rh/devtoolset-10/enable
脚本,所以现在当我这样做时:
g++ --version
我明白了:
g++ (GCC) 10.2.1 20210130 (Red Hat 10.2.1-11)
太棒了。问题是,
/usr/include/c++
下的标题仍然指向旧的libstdc++-4.8.5
。也就是说,如果我在 ls
中执行 /usr/include/c++
,我看到的只是:
bash-4.2$ ls /usr/include/c++
4.8.2 4.8.5
“启用”
libstdc++-10
成为默认系统 C++ stdlib 的魔法是什么?
开发工具集-10
每个 g++ 都有它自己的标头。
/usr/include/c++/4.8*
仅适用于 4.8.5。
devtoolset-10:g++ 版本 10 使用
/opt/rh/devtoolset-10/root/usr/include/c++/10
处的标头
“启用”libstdc++-10
没有共享库“libstdc++-10”。有
/opt/rh/devtoolset-10/root/usr/lib/gcc/x86_64-redhat-linux/10/{ libstdc++.a, libstdc++.so }
,其中 libstdc++.so 是一个约 200B 的文本文件。
我猜用户应该向 gcc 查询包含路径。 在我的 CentOS 上 /usr/include/c++ 不是符号链接,也不应该指向任何地方,但可以使用更新替代方案解决这个问题(不过,我只为编译器本身这样做)。可能会被更新覆盖,但这种情况在 CentOS 上发生的频率并不高。
“启用”
成为默认系统 C++ stdlib 的魔法是什么?libstdc++-10
开发者工具集采用混合联动模型。这意味着它不自带
libstdc++.so.6
,而是尽可能使用系统版本。缺失的部分是静态链接的。这是通过 Knud Larsen 提到的链接描述文件实现的。