我正在开发一个可以在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二进制文件?我正在试着让它变得便携。
发布于 2021-09-07 04:32:26
为了尝试使代码可移植,我使用以下命令进行编译
与流行的想法相反,全静态Linux二进制文件的可移植性较差--只有在运行时安装的GLIBC版本与构建期间使用的版本完全相同时,才能保证正常工作。另请参见this answer。
会不会是
导致的呢?
我是否必须编译单独的CentOS 7和CentOS 8二进制文件?
只有在你坚持使用全静态链接的情况下。
您可以在CentOS 7上(或者在chroot中,或者在docker容器中,或者在VM中)使用动态libc.so.6构建二进制文件,它在CentOS 8上也可以很好地工作。
https://stackoverflow.com/questions/69082168
复制相似问题