编译包含低级静态库的共享库

问题描述 投票:0回答:1

我有一个在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)

我应该在这里做什么?

cmake static g++ glibc
1个回答
0
投票

所以我想将所需的低级库包含到我的工具中。我的编译系统中有 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 容器更复杂。

© www.soinside.com 2019 - 2024. All rights reserved.