【问题标题】:How to link to an older version math library?如何链接到旧版本的数学库?
【发布时间】:2020-02-06 10:49:34
【问题描述】:

我即将向我的客户发布一个库 (.so)。 但是,我客户的平台是一个非常古老的 debian(2017 年发布的 9.1)。 我的库仅适用于 >= glibc-2.27。
我设法通过以下技巧运行程序

// copy libm-2.27.so from my computer to the old debian
ln -sf ./libm-2.27.so libm.so.6
gcc ./test.c -o ./test -lmylib -L ./ -lm
LD_LIBRARY_PATH=`pwd` ./test

但我的客户不接受这种解决方案。
是否可以链接到旧版本的数学库?
例如,客户给了我数学库,我在我的计算机上将我的库与它链接起来。

谢谢!

【问题讨论】:

  • 是的,这可能有效,但不是很好。如果您确实想使用新版本的 libm,则应改为静态链接。
  • 但是最好的办法是在 Debian 9.1 上为这个客户构建你的库版本 - 例如。设置 VM 或 Docker。不过,更改编译器或 glib 的其他部分可能会导致问题。
  • 我没有运气静态链接 libm。我得到了这个 /usr/bin/ld: /usr/lib/x86_64-linux-gnu/libm-2.27.a(e_atan2.o): relocation R_X86_64_PC32 针对未定义的符号 `_dl_x86_cpu_features' 在制作共享对象时不能使用;使用 -fPIC /usr/bin/ld 重新编译:最终链接失败:错误值 collect2:错误:ld 返回 1 个退出状态
  • 是否可以在我的 ubuntu 18.04 上安装与 debian 9 匹配的工具链?
  • 对不起,你说的静态链接是对的:我忘了你自己在建一个库。您可能可以在 chroot 中设置现有的 Debian 二进制文件,或者从 GCC 源代码开始并构建一个针对 Debian 库的交叉编译器?

标签: linux ubuntu gcc glibc libc


【解决方案1】:

我的库仅适用于 >= glibc-2.27。

是因为您实际上需要添加到 GLIBC-2.27 中的功能,还是因为您的系统恰好安装了该版本而您不知道如何为旧系统构建?

从 cmets 看来,您实际上并不需要 GLIBC-2.27。

在这种情况下,最简单的解决方案是安装一个装有 Debian 9.1 的 VM,并在该 VM 中构建您的库。

这有一个额外的优势,即您可以在将库发送给客户之前在与客户环境相匹配的环境中测试

如果您不想要 VM,则列出了其他解决方案 here

我通过以下技巧设法运行程序......但我的客户不接受这个解决方案。

您的客户聪明拒绝该解决方案:它通常无法正常工作,并且在这样的环境中运行会使您的客户面临大量潜在的未定义行为和崩溃。要了解为什么会这样,请阅读this answer

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-06
    • 1970-01-01
    • 2016-04-10
    • 2014-07-23
    • 1970-01-01
    • 1970-01-01
    • 2011-10-30
    相关资源
    最近更新 更多