c++ - 在 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 不是一个可识别的命令。
任何帮助或指导表示赞赏。
解决方案
您必须处理多个问题。
问题:如果您替换 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
可执行文件以在该已知位置搜索共享库。
当然,您必须遵守分发这些库的许可,但这很容易。
推荐阅读
- azure - 无法使用数据工厂将多个 BLOB 归档到 Synapse
- mysql - GROUP BY 的 MySQL 键
- javascript - 如何用 puppeteer 抓取 src 图像?
- android - 在 Unity 3d Android 平台中将图像从一个文件夹复制到另一个文件夹
- security - 我可以使用密钥本身计算 RSA 密钥的数据完整性检查吗?
- java - 获取 java.security.InvalidKeyException: Key must be 128, 192, or 256 bit long twofish
- redux - 为什么,在 Redux 中使用 useEffect() 和 .then() 时,我得到一个错误:Actions must be plain objects。使用自定义中间件进行异步操作
- javascript - 为什么 offsetX 和 offsetY 在 Firefox 和 chrome 中返回不同的值
- python - SessionNotCreatedException:会话未创建:此版本的 ChromeDriver 仅支持使用 Selenium 的 Chrome 版本 84
- python - 使用 Python 最大化作业调度的利润