gcc - 在没有 gcc8 的生产环境中运行使用 gcc8 构建的程序
问题描述
我的开发/生产环境都是 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,因此我的程序无法在生产环境中加载。如何让这样的程序运行?
谢谢!请原谅我丑陋的英语。
解决方案
为了不必复制或发送单独的libstdc++.so
链接,而是静态链接(如评论中所建议的)针对C++
运行时,可以将C++
程序链接到-static-libstdc++
(同时指定-static-libgcc
也将确保程序不依赖于足够新的版本系统上的 libgcc_s.so - 尽管这应该很少成为问题)。
也可能存在目标系统版本glibc
太旧(相对于构建系统)的问题。在这种情况下,无论如何都可以编译gcc
旧系统上的任何最新版本,以便生成的C++
可执行文件以及libstdc++
与旧的glibc
. 链接C++
程序-static-libstdc++
将再次有助于不依赖于必须能够libstdc++.so
在运行时找到的程序。
最后,C++
程序也可以链接到-static
根本不依赖任何动态库。
推荐阅读
- python - 为什么带有空格的搜索词在 pyparsing 中无法正确解析?
- node.js - Nuxt 致命错误“找不到模块 'dir-glob'”
- mongodb - 基于另一个集合中的条件进行聚合
- amazon-web-services - IoT Analytics 数据存储为空
- typescript - 使用 JSON 对象循环遍历数组并将值推送到 MAP - Typescript
- java - java的网络编程库,类似于用于python的scapy
- html - angular - 仅针对特定对象在 html 表 ngFor 中显示值
- javascript - 与后端服务器重用 http 连接 - web fetch API
- timestamp - CAPL:如何在 CANoe <13 中转换UTCDateToUnixTimestamp
- google-apps-script - 您无权访问此文档 Appscript