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