我正在构建一个使用英特尔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
答案 0 :(得分:5)
按/path/to/lib
是指包含库的目录的路径,还是实际文件的路径?
给定目录参数的-R
选项被ld视为-rpath
,这是您实际想要的选项。它将给定目录添加到运行时库搜索路径。这应该工作,只要你给它目录而不是文件名。我对此非常有信心,自己完成了,因为它是libtool提供的暗示之一:
已在以下位置安装了库:
/路径/到/库目录
如果您碰巧想要链接已安装的库 在给定目录LIBDIR中,您必须使用libtool和 指定库的完整路径名,或使用`-LLIBDIR' 在链接期间标记并至少执行以下操作之一:
- 将LIBDIR添加到`LD_LIBRARY_PATH'环境变量中 执行期间
- 将LIBDIR添加到`LD_RUN_PATH'环境变量中 在链接期间
- 使用`-Wl,-rpath -Wl,LIBDIR'链接器标志
- 让您的系统管理员将LIBDIR添加到`/etc/ld.so.conf'
(我在这里粘贴它,因为可以想象其中一个选项可能更合适 - 例如LD_RUN_PATH可以保存你的makefile修改)
答案 1 :(得分:2)
您可以通过在二进制文件上运行-R
命令或ldd
命令来检查是否从readelf
标志中获取了库的路径。 LD_LIBRARY_PATH
环境变量是一个覆盖,因此通常不需要。
答案 2 :(得分:2)
正如Richard Pennington所建议的那样,我的应用程序并没有直接使用缺少的库,但它被我使用的共享库使用。由于我无法重新编译IPP,我的问题的解决方案是在编译时添加-liomp5
,使用链接器的-R选项。这实际上为libiomp5.so添加了rpath来修复问题!
答案 3 :(得分:0)
如果可能,您应该使用-R选项。
如果没有,请重命名您的可执行文件并创建一个运行您的可执行文件的启动脚本,并在那里为该范围设置LD_LIBRARY_PATH。
根据平台,您可以通过/etc/ld.so.conf.d(Redhat / Fedora)来修改ld.so.conf,这使得从部署方案“更容易”部署对ld.so的更改。
答案 4 :(得分:0)
除了这里发布的所有有用提示之外......你不是试图在32位系统上使用64位特定库(或者反之,取决于其他条件),是吗?
答案 5 :(得分:-1)
击:
export LD_LIBRARY_PATH=/path/to/lib
tcsh的:
setenv LD_LIBRARY_PATH /path/to/lib
答案 6 :(得分:-1)
尝试配置ldconfig
到ld.so.conf
,以便默认搜索/opt/...
目录。