首页 > 解决方案 > 在 RedHat Linux Enterprise Developer Workstation 上编译 C++17 代码

问题描述

我四处搜索,找不到在 Red Hat Enterprise Linux 7.5 Developer Workstation 上编译 c++17 源代码的明确方法。

我已经能够使用以下命令在 Fedora 上成功编译 C++17 源代码:

g++ -std=c++1z main.cpp -o main

我在我的 Red Hat 工作站上尝试了相同的操作,并收到一条消息说 g++ -std=c++1z 不是一个可识别的命令。

任何帮助或指导表示赞赏。

标签: c++linuxredhatc++17

解决方案


您必须处理多个问题。

问题:如果您替换 RedHat 安装(和支持)的 GCC 版本,您将失去支持。

简单的答案是“不要那样做”。

--prefix不要替换已安装的 GCC,而是使用构建配置的参数构建您自己的版本并将其安装到不同的目录中。

这真的很容易做到,它只有十几行命令。以下是来自GCC Wiki的基本内容:

tar xzf gcc-4.6.2.tar.gz
cd gcc-4.6.2
./contrib/download_prerequisites
cd ..
mkdir objdir
cd objdir
$PWD/../gcc-4.6.2/configure --prefix=$HOME/GCC-4.6.2 --enable-languages=c,c++,fortran,go
make
make install

(只是不要忘记4.6.2用你想要的任何版本的 GCC 替换。)

例如,如果你这样做./configure --prefix=/usr/local/mycompany/gcc-8.1.0/,那么make install将把编译器放在那个目录下 ( /usr/local/mycompany/gcc-8.1.0/) 而不是 in/usr//usr/local/

您可以通过为所有可执行文件添加前缀或后缀来进一步减少混淆。g++这样一来,您正在执行的版本就不会产生歧义。例如,如果您使用,--program-suffix=-8.1.0那么每次调用都g++-8.1.0将显然是您的新编译器,并且g++将使用系统默认值。

问题:glibc兼容性

如果您并行安装新版本的 GCC,则使用该编译器编译的任何应用程序都将依赖于较新版本的glibc. 这打破了在 RHEL 上构建的优势之一,即在您的实例上运行的某些东西将在所有其他实例上运行,并且不会破坏其他任何东西的承诺。

如果您的产品是 GPL 的,那么有一个简单的解决方案 - 只需静态链接所需的库。GCC 对此有编译标志:-static-libstdc++-static-libgcc. 如果您的产品不是 GPL,那么您必须查看许可证。IIRC,这些库对于作为 GCC 编译的程序的一部分分发有特殊的规定,但我不是律师。

如果做不到这一点,您可以将库作为共享库(.so文件)分发,并让您的安装脚本下载并将它们安装到已知位置。在构建您的应用程序时,设置链接器标志以设置rpath可执行文件以在该已知位置搜索共享库。

当然,您必须遵守分发这些库的许可,但这很容易。


推荐阅读