10

我正在构建一个使用英特尔IPP库的 C++ 应用程序。该库默认安装在 /opt 中,需要您设置LD_LIBRARY_PATH编译和运行软件(如果您选择共享库链接,我这样做了)。我已经修改了我的configure.ac/Makefile.am以便在编译时不需要设置该变量,但是在运行时我仍然找不到共享库;我怎么做?

我正在使用-Wl, -R/path/to/libdir标志编译g++

更新 1:实际上我的二进制程序有一些正确链接的 IPP 库,但只有一个不是:

$ ldd myprogram
linux-vdso.so.1 =>  (0x00007fffa93ff000)
libippacem64t.so.6.0 => /opt/intel/ipp/6.0.2.076/em64t/sharedlib/libippacem64t.so.6.0 (0x00007f22c2fa3000)
libippsem64t.so.6.0 => /opt/intel/ipp/6.0.2.076/em64t/sharedlib/libippsem64t.so.6.0 (0x00007f22c2d20000)
libippcoreem64t.so.6.0 => /opt/intel/ipp/6.0.2.076/em64t/sharedlib/libippcoreem64t.so.6.0 (0x00007f22c2c14000)
[...]
libiomp5.so => not found
libiomp5.so => not found
libiomp5.so => not found

当然图书馆在那里:

$ locate libiomp5.so
/opt/intel/ipp/6.0.2.076/em64t/sharedlib/libiomp5.so
4

7 回答 7

5

/path/to/lib您是指包含库的目录的路径,还是实际文件的路径?

-R给定目录参数的选项-rpath被 ld 处理,这是您在此处实际需要的选项。它将给定目录添加到运行时库搜索路径。只要您给它目录而不是文件名,那应该可以。我对此相当有信心,我自己做过,因为这是 libtool 给出的提示之一:

库已安装在:

/path/to/库目录

如果您碰巧想要链接给定目录 LIBDIR 中已安装的库,则必须使用 libtool 并指定库的完整路径名,或者在链接期间使用“-LLIBDIR”标志并至少执行以下操作之一下列的:

  • 在执行期间将 LIBDIR 添加到“LD_LIBRARY_PATH”环境变量中
  • 在链接期间将 LIBDIR 添加到 `LD_RUN_PATH' 环境变量
  • 使用 `-Wl,-rpath -Wl,LIBDIR' 链接器标志
  • 让您的系统管理员将 LIBDIR 添加到 `/etc/ld.so.conf'

(我将其粘贴在这里,因为可以想象其他选项之一可能更可取 - 例如 LD_RUN_PATH 可以为您节省 makefile 修改)

于 2010-03-20T18:56:26.630 回答
2

您可以通过在二进制文件上运行命令或命令来检查库的路径是否从您的-R标志中获取。环境变量是一个覆盖,因此通常不需要。lddreadelfLD_LIBRARY_PATH

于 2010-03-20T19:01:20.737 回答
2

正如 Richard Pennington 所建议的,我的应用程序不直接使用缺少的库,但我使用的共享库使用了它。由于我无法重新编译 IPP,我的问题的解决方案是-liomp5在编译时添加,使用链接器的 -R 选项。这实际上为 libiomp5.so 添加了 rpath 来解决问题!

于 2010-03-22T19:16:54.553 回答
0

如果可能,您应该使用 -R 选项。

如果没有,请重命名您的可执行文件并创建一个运行您的可执行文件的启动脚本,并在那里为该范围设置 LD_LIBRARY_PATH。

根据平台,您可以通过 /etc/ld.so.conf.d 修改 ld.so.conf(想到 Redhat/Fedora),这使得从部署场景中“更容易”部署对 ld.so 的更改。

于 2010-03-20T20:02:57.537 回答
0

除了此处发布的所有有用提示之外..您并没有尝试在 32 位系统上使用 64 位特定库(反之亦然,取决于其他条件),是吗?

于 2010-03-20T21:01:07.640 回答
-1

重击:

export LD_LIBRARY_PATH=/path/to/lib

tcsh:

setenv LD_LIBRARY_PATH /path/to/lib
于 2010-03-20T18:54:30.303 回答
-1

尝试配置您的ldconfigthrough ld.so.conf,以便它默认搜索您的/opt/...目录。

于 2010-03-20T19:46:25.377 回答