在CentOS 8上为CentOS 7编译

tct7dpnv  于 2022-11-08  发布在  其他
关注(0)|答案(1)|浏览(255)

我正在开发一个程序,它将运行在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,以防万一。我唯一注意到的是glibc在CentOS 8上的版本是2.28,而在CentOS 7上的版本是2.17。这会导致它吗?我必须编译一个单独的CentOS 7和CentOS 8二进制文件吗?我正在努力使它具有可移植性。

41zrol4v

41zrol4v1#

为了使代码具有可移植性,我使用以下命令进行编译
不要这样做。与普遍的看法相反,完全静态的Linux二进制代码 * 较 * 不容易移植--只有在运行时安装了与构建时使用的版本 * 完全 * 相同的GLIBC版本的情况下才能保证工作。这就是警告告诉你的。另请参见this answer
会不会是这个引起的?
它可以,而且确实如此。
我是否必须编译一个单独的CentOS 7和CentOS 8二进制文件?
只有在您坚持使用完全静态链接的情况下。
您可以在CentOS 7上使用 dynamiclibc.so.6(或者在chroot、docker容器或VM中)构建二进制文件,它在CentOS 8上也能很好地工作。

相关问题