共享库的“替代品”?这还有效吗?

共享库的“替代品”?这还有效吗?

我正在尝试链接一个具有几种不同实现的共享库 - 特别是 blas、openblas 和 atlas 都通过/usr/lib/libblas.soUbuntu 14.04 上的替代方案提供相同的二进制接口(以及 12.04 上类似但不完全相同的设置)。当我将 GCC 与-lblas链接器一起使用时,似乎实际上通过替代链接解析到实际实现,因此 - 例如,如果我安装了 openblas,它将链接到实际的 openblas 二进制文件,然后如果我在系统上安装生成的可执行文件在安装了 atlas 的情况下,动态链接器将无法加载库,因为它看不到替代链接。

有没有办法让 GCC 使用“替代”符号链接作为 dl 目标,以便它实际上按update-alternatives预期工作?

答案1

符号链接解析是这里的一个功能。通过解析libblas.soto libblas.so.3,生成的可执行文件将固定到特定的 so 版本。 (当库的二进制接口向后不兼容地更改时,会发生对 so 版本的更改,即3in ,因此这是期望的。libblas.so.3

问题似乎是您的目标系统没有libblas.so.3,所以我建议如下:

  1. libblas.so.3确保您的应用程序已经链接到。
  2. 在目标系统上,创建从实际 libblas.so 到所需名称的符号链接libblas.so.3,以便在 LD_LIBRARY_PATH 中找到此符号链接:

    mkdir ./mylib
    ln -s /usr/lib/libblas.so ./mylib/libblas.so.3
    LD_LIBRARY_PATH=$PWD/mylib:$LD_LIBRARY_PATH ./myexecutable
    

相关内容