centos - 在 CentOS 8 上为 CentOS 7 编译
问题描述
我正在开发一个可以在 CentOS 8 和 CentOS 7 系统上运行的程序。在其中,我使用 gethostbyname 将 DNS 名称解析为 IP 地址。
为了尝试使代码可移植,我正在使用以下命令进行编译:
g++ -static stats-agent.cpp -o stats-agent
当它编译时,我得到以下信息:
/tmp/ccVDW5ph.o: In function `main':
stats-agent.cpp:(.text+0x45c): warning: Using 'gethostbyname' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking
现在,当我将二进制文件移至 CentOS 7 系统并尝试运行它时,我得到以下信息:
stats-agent: dl-call-libc-early-init.c:37: _dl_call_libc_early_init: Assertion `sym != NULL' failed.
Aborted
我检查了 glibc、glib-devel 和 glibc-static。我唯一注意到的是 CentOS 8 上的 glibc 版本是 2.28,而 CentOS7 上的版本是 2.17。这可能是造成的吗?我需要编译一个单独的 CentOS 7 和 CentOS 8 二进制文件吗?我正在尝试使其便携。
解决方案
为了尝试使代码可移植,我正在使用以下命令进行编译
不。与普遍的看法相反,完全静态的 Linux 二进制文件的可移植性较差——只有在运行时安装与构建期间使用的完全相同的 GLIBC 版本才能保证工作。这就是警告告诉你的。另请参阅此答案。
这可能是造成的吗?
它可以,而且确实如此。
我需要编译一个单独的 CentOS 7 和 CentOS 8 二进制文件吗?
仅当您坚持完全静态链接时。
您可以在 CentOS 7(或在 . 、docker 容器或虚拟机中)使用动态 构建二进制文件,它也可以在 CentOS 8 上正常工作。libc.so.6
chroot
推荐阅读
- google-tag-manager - 使用跟踪代码管理器中的查找表根据 URL 确定要将数据发布到哪个 Analytics 媒体资源
- docker - 我们可以在容器运行时用 docker-compose 替换图像吗
- html - 为什么CSS规则正确没有效果?
- python - 异步输入信号
- python - OR-TOOLS google 如何告诉求解器在达到某个结果时停止
- python-3.x - 导入 matplotlib 时。我收到错误:没有名为“numpy.core._multiarray_umath”的模块
- unit-testing - Mockito 无法模拟 java.lang.reflect.Method
- javascript - 将最新的道具发送到 mousemove 事件监听器
- kendo-ui - 剑道图表刷新数据不变
- installation - 如何在 WIX 的自定义对话框中添加超链接