我有一个在Ubuntu 22.04上编译的工具,但是这个工具需要在Centos 7系统上运行。 Ubuntu有较高版本的glibc,在Centos 7上运行编译工具时,出现错误:
ImportError: /lib64/libm.so.6: version `GLIBC_2.27' not found
此错误来自于工具中需要的共享库文件。所以我想将所需的低级库包含到我的工具中。我的编译系统中有
libm.a
文件,我想将其合并到共享库中。
我尝试将其与以下命令合并:
find_library(M_LIBRARY m REQUIRED)
find_library(Z_LIBRARY z REQUIRED)
target_link_options(onnx_cpp2py_export PRIVATE "-Wl,-Bstatic" "-lm" "-lc" "-lz")
和
target_link_libraries(onnx_proto PRIVATE "/usr/lib/x86_64-linux-gnu/libz.a"
"/usr/lib/x86_64-linux-gnu/libm.a"
"/usr/lib/x86_64-linux-gnu/libc.a"
"-Wl,-fPIC")
但都不起作用。我说它不起作用是因为 onnx_cpp2py_export.so 仍然在 libm.so.6 上进行复制
root@75b3e00f1508:/static/build# ldd onnx_cpp2py_export.so
linux-vdso.so.1 (0x00007ffeae184000)
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f68d55fd000)
libm.so.6 => /usr/lib/x86_64-linux-gnu/libm.so.6 (0x00007f68d5516000)
libgcc_s.so.1 => /usr/lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f68d54f6000)
libc.so.6 => /usr/lib/x86_64-linux-gnu/libc.so.6 (0x00007f68d52cd000)
/lib64/ld-linux-x86-64.so.2 (0x00007f68d5fb9000)
我应该在这里做什么?
所以我想将所需的低级库包含到我的工具中。我的编译系统中有 libm.a 文件,我想将其合并到共享库中。
这种方法通常不起作用,因为
libm.a
依赖于libc.so
,并且您不能在单个进程中混合和匹配GLIBC的多个部分。
如果从任一系统简单地使用
libm.a
也不起作用,因为 libm.a
通常不是用 -fPIC
构建的,因此无法链接到 x86_64
上的共享库。
如果您的工具需要运行 CentOS 7,那么最好(也是唯一保证有效)的解决方案是将其链接到 CentOS 7 兼容库。
最简单的方法是使用 CentOS 7 设置 docker 容器,并在该容器中构建您的工具。
其他替代方案包括在虚拟机中构建
chroot
,或使用 Linux 到旧版 Linux 交叉编译器。但所有这些都比简单的 docker 容器更复杂。