Kji*_*jir 10 c++ g++ autotools shared-libraries intel-ipp
我正在构建一个使用Intel的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
Run Code Online (Sandbox Code Playgroud)
当然图书馆在那里:
$ locate libiomp5.so
/opt/intel/ipp/6.0.2.076/em64t/sharedlib/libiomp5.so
Run Code Online (Sandbox Code Playgroud)
通过/path/to/lib你的意思路径包含库,或路径的实际文件的目录?
-R给定目录参数的选项与-rpathld一样,这是您实际上在这里想要的选项。它将给定目录添加到运行时库搜索路径。只要您给它提供目录而不是文件名,它就应该起作用。我对此非常有信心,我自己做了,因为这是libtool给出的提示之一:
库已安装在:
/ path / to / library-directory
如果您碰巧要链接到给定目录LIBDIR中已安装的库,则必须使用libtool,并指定库的完整路径名,或在链接期间使用-LLIBDIR标志,并至少执行以下一项操作:以下:
- 在执行期间将LIBDIR添加到“ LD_LIBRARY_PATH”环境变量
- 在链接期间将LIBDIR添加到“ LD_RUN_PATH”环境变量中
- 使用`-Wl,-rpath -Wl,LIBDIR'链接器标志
- 让系统管理员将LIBDIR添加到`/etc/ld.so.conf'
(我将其粘贴在这里,因为可能更希望使用其他选项之一,例如LD_RUN_PATH可以节省对makefile的修改)
正如 Richard Pennington 所建议的,缺少的库不是由我的应用程序直接使用的,而是由我使用的共享库使用的。由于我无法重新编译 IPP,因此问题的解决方案是在编译时添加-liomp5,使用链接器的 -R 选项。这实际上添加了 libiomp5.so 的 rpath 来解决问题!
| 归档时间: |
|
| 查看次数: |
9068 次 |
| 最近记录: |