我刚刚发现RedHat提供了这个"开发人员工具集",它允许我安装(当然还有)最新的gcc-4.7.2.我在Centos上使用它,但过程是一样的.
安装后,您可以通过发出以下命令启用此工具集的新bash会话:
scl enable devtoolset-1.1 bash
Run Code Online (Sandbox Code Playgroud)
这很好用.现在,我可以以某种方式将此添加到我的bashrc中,因为这实际上启动了一个新的bash会话吗?或者我应该更好地将它放在我的makefile中,以避免开始新的bash会话.有没有办法在makefile中发出这个?
我的目标是在Centos 7上使用gcc 7.2(和clang 6)构建与Centos 7目标兼容的可执行文件,而不安装devtoolset,但*使用较新的C++ ABI*.
较新的ABI修复了lib中的一些缺陷,这些缺陷在没有ABI更改的情况下无法修复.例如list :: size O(1)Vs O(n),字符串没有COW.
我猜测为什么在以下问题中可能无法实现这一点. -D_GLIBCXX_USE_CXX11_ABI = 1对CentOS 7上的devtoolset-7无效
在 Amazon Linux 2 Docker 映像上,“yum install gcc”安装 gcc 7.3.1。
我想安装 gcc 8。它似乎通常可以作为“devtoolset-8”的一部分安装(https://www.softwarecollections.org/en/scls/rhscl/devtoolset-8/),但说明CentOS 或 RHEL 似乎不适用于 Amazon Linux。
那么在 Amazon Linux 上安装 gcc 8 的唯一方法是从源代码安装?
我还需要 devtoolset-8-toolchain,如何安装?
我正在运行 CentOS 6.4 并且需要更高版本的 C++ 编译器来构建我的开发工具(在本例中为 Qt Creator)。
我不清楚使用 devtools 的含义,我希望有人能解释一下。
我正在使用Developer Toolset 7 中的编译器为 Red Hat/CentOS 7(在 CentOS 上运行)编译软件 ,当我尝试创建 RPM 时,rpmbuild 失败并显示以下错误:
+ /usr/lib/rpm/find-debuginfo.sh --strict-build-id -m --run-dwz --dwz-low-mem-die-limit 10000000 --dwz-max-die-limit 110000000 /home/peter/src/foo/rpmbuild/BUILD/mypackage-5.4.0_10_243_g2564bd2ee3
extracting debug info from /home/peter/rpmbuild/BUILDROOT/mypackage-5.4.0_10_243_g2564bd2ee3-1.x86_64/path/to/my/bin/binary
eu-strip: error while loading shared libraries: libelf.so.dts.1: cannot open shared object file: No such file or directory
Run Code Online (Sandbox Code Playgroud)
我在使用 Toolset 3 时没有看到这个,基本上我所做的就是将构建脚本中的 3 更改为 7。
编辑:如果我禁用提取调试信息 ( %define debug_package %{nil}
),我不会收到错误消息。
我正在使用CentOS 6.3的devtoolset-1.0来临时升级GCC版本。尽管我现在可以编译我的C ++应用程序,但最终的二进制文件缺少一些符号:
$ ldd -d -r myapp
$ [..]
$ libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x0000003216e00000)
$ [..]
$ undefined symbol: _ZNSt8__detail15_List_node_base11_M_transferEPS0_S1_ (./myapp)
$ undefined symbol: _ZNSt8__detail15_List_node_base7_M_hookEPS0_ (./myapp)
$ undefined symbol: _ZNSt8__detail15_List_node_base9_M_unhookEv (./myapp)
Run Code Online (Sandbox Code Playgroud)
我发现,这些是一些新功能,在旧的libstdc ++中找不到,但是在较新的libstdc ++中找不到。在我的系统上,同时安装了libstdc ++(默认版本4.4.7)和devtoolset-1.0-libstdc ++-devel(4.7通过devtoolset)。有趣的是,来自devtoolset的libstdc ++再次链接到旧的:
$ cat /opt/centos/devtoolset-1.0/root/usr/lib/gcc/x86_64-redhat-linux/4.7.0/libstdc++.so
$ /* GNU ld script
$ Use the shared library, but some functions are only in
$ the static library, so try that secondarily. */
$ OUTPUT_FORMAT(elf64-x86-64)
$ INPUT ( /usr/lib64/libstdc++.so.6 -lstdc++_nonshared )
Run Code Online (Sandbox Code Playgroud)
我真正想要的是替换libstdc ++绑定,但是我不知道该如何实现。我已经尝试设置LD_LIBRARY_PATH并指向devtoolset目录,但是libstdc ++仍然设置为旧位置。另外,符号链接也没有成功,因为它是ld脚本而不是实际的共享库。
我想devtoolset-7
在 CentOS 7 上构建 C++11 应用程序。我正在尝试使用该库,但CentOS 7 本身包含的<regex>
版本4.8.4不支持它。libstdc++
我已按照以下说明安装并启用 SCL/ devtoolset-7
:
$ sudo yum install centos-release-scl
$ sudo yum install devtoolset-7
$ scl enable devtoolset-7 bash
Run Code Online (Sandbox Code Playgroud)
此时,如果我调用g++
,它就是正确的版本 (7.2.1),但是当我构建应用程序并在它们上运行时,它们仍然动态链接到系统上的ldd
旧版本。/lib64/libstdc++.so.6
可靠链接的最简单方法是什么devtoolset-7-libstdc++-devel-7.2.1
?我使用 CMake 3 作为构建系统。
考虑在Centos 7
虚拟机或容器中构建和发布C++项目时的情况.默认gcc
为Centos 7
是4.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
...
Run Code Online (Sandbox Code Playgroud)
这是编译和链接命令的简短示例:
[ 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 …
Run Code Online (Sandbox Code Playgroud) 我有一个遗留的代码库,我们正试图从中迁移devtoolset-4
到devtoolset-7
.我注意到有关有符号整数溢出的有趣行为(int64_t
具体而言).
有一个代码片段,用于检测整数溢出,同时乘以一大组整数:
// a and b are int64_t
int64_t product = a * b;
if (b != 0 && product / b != a) {
// Overflow
}
Run Code Online (Sandbox Code Playgroud)
这段代码与devtoolset-4一起工作正常.但是,使用devtoolset-7时,永远不会检测到溢出.
例如:当a = 83802282034166
和b = 98765432
,
product
变为-5819501405344925872
(显然值已溢出).
但product / b
结果价值等于a (83802282034166)
.因此,if
情况永远不会成真.它的值应该根据overflown(负)product
值计算:-5819501405344925872 / 98765432 = -58922451788
具有讽刺意味的是,数学是正确的,但它导致devtoolset-4的异常行为.
product / b != a
为product != a * b
并达到相同的溢出值(或者可能只是根据上面的语句跳过计算 …我在 RHEL6 和 RHEL7 上安装了 gcc 5.2.1,看起来 _GLIBCXX_USE_CXX11_ABI 被禁用了。即使我手动运行它也不起作用-D_GLIBCXX_USE_CXX11_ABI=1 -std=c++14
。这意味着我不会获得小字符串优化功能。例如,以下代码的输出始终为 8 和“micro not set”。对于 SSO,如果我们查看代码 bits/basic_string.h,std::string 的大小应至少为 16。有什么解决办法吗?
#include <string>
#include <iostream>
int main()
{
std::cout << sizeof(std::string) << std::endl;
#if _GLIBCXX_USE_CXX11_ABI
std::cout << "macro set" << std::endl;
#else
std::cout << "macro not set" << std::endl;
#endif
}
Run Code Online (Sandbox Code Playgroud) 在我的centos7中,我尝试将scl enable devtoolset-8 bash
命令放入~/.bashrc,但是当我登录时,进程scl enable devtoolset-8 bash
会一次又一次启动,直到进程号达到用户最大进程号。
所以我该怎么做?
我的开发/生产环境都是 CentOS-7.7。为了用 gcc-8.3.0 编译我的程序,我在我的开发环境中安装了“devtoolset-8”,但它不能像 CentOS7 最初附带的 gcc-4.8.5 一样使用。每次需要编译程序时,必须使用“scl enable devtoolset-8 -- bash”切换到gcc8而不是gcc4.8.5。
当程序部署到生产环境时,没有gcc8,也没有libstdc++.so.6.0.25,所以它不能运行。我猜 libstdc++.so.6.0.25 应该和 gcc8 一起发布?我既不能在生产环境上安装“devtoolset-8”,也不能在生产环境上从源代码构建 gcc8。CentOS官方yum repo安装的libstdc++版本是libstdc++.so.6.0.19,所以我的程序无法在production-env中加载。如何让这样的程序运行?
谢谢!请原谅我丑陋的英语。