我正在尝试链接一个具有几种不同实现的共享库 - 特别是 blas、openblas 和 atlas 都通过/usr/lib/libblas.so
Ubuntu 14.04 上的替代方案提供相同的二进制接口(以及 12.04 上类似但不完全相同的设置)。当我将 GCC 与-lblas
链接器一起使用时,似乎实际上通过替代链接解析到实际实现,因此 - 例如,如果我安装了 openblas,它将链接到实际的 openblas 二进制文件,然后如果我在系统上安装生成的可执行文件在安装了 atlas 的情况下,动态链接器将无法加载库,因为它看不到替代链接。
有没有办法让 GCC 使用“替代”符号链接作为 dl 目标,以便它实际上按update-alternatives
预期工作?
答案1
符号链接解析是这里的一个功能。通过解析libblas.so
to libblas.so.3
,生成的可执行文件将固定到特定的 so 版本。 (当库的二进制接口向后不兼容地更改时,会发生对 so 版本的更改,即3
in ,因此这是期望的。libblas.so.3
问题似乎是您的目标系统没有libblas.so.3
,所以我建议如下:
libblas.so.3
确保您的应用程序已经链接到。在目标系统上,创建从实际 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