使用-rpath后仍无法找到OpenCV CUDA相关库的问题咨询
OpenCV CUDA库无法通过rpath解析的问题
我开发了一个基于OpenCV的程序,链接时使用了-L/path/to/opencv/lib参数,同时通过-Wl,-rpath指定了库路径。但执行ldd检查时发现,大部分OpenCV库(如opencv_core)可正常找到,所有CUDA相关库(如opencv_cudaarithm)却无法找到。将OpenCV库路径添加到LD_LIBRARY_PATH后问题解决,但我认为无需修改该环境变量即可正常运行,毕竟已有部分库路径可被解析。请问这是什么原因?
编辑补充:无报错信息。
添加OpenCV路径到LD_LIBRARY_PATH前的ldd输出:
libopencv_imgcodecs.so.3.4 => /usr/Local/opencv/v.3.4.13/lib/libopencv_imgcodecs.so.3.4 (0x00007fcf7acd4000) libopencv_imgproc.so.3.4 => /usr/Local/opencv/v.3.4.13/lib/libopencv_imgproc.so.3.4 (0x00007fcf7918e000) libopencv_core.so.3.4 => /usr/Local/opencv/v.3.4.13/lib/libopencv_core.so.3.4 (0x00007fcf77fb0000) libopencv_photo.so.3.4 => /usr/Local/opencv/v.3.4.13/lib/libopencv_photo.so.3.4 (0x00007fcf77dfe000) libopencv_cudaimgproc.so.3.4 => not found libopencv_cudaarithm.so.3.4 => not found
添加后的ldd输出:
libopencv_imgcodecs.so.3.4 => /usr/Local/opencv/v.3.4.13/lib/libopencv_imgcodecs.so.3.4 (0x00007fcf7acd4000) libopencv_imgproc.so.3.4 => /usr/Local/opencv/v.3.4.13/lib/libopencv_imgproc.so.3.4 (0x00007fcf7918e000) libopencv_core.so.3.4 => /usr/Local/opencv/v.3.4.13/lib/libopencv_core.so.3.4 (0x00007fcf77fb0000) libopencv_photo.so.3.4 => /usr/Local/opencv/v.3.4.13/lib/libopencv_photo.so.3.4 (0x00007fcf77dfe000) libopencv_cudaimgproc.so.3.4 => /usr/Local/opencv/v.3.4.13/lib/libopencv_cudaimgproc.so.3.4 (0x00007fcf76b03000) libopencv_cudaarithm.so.3.4 => /usr/Local/opencv/v.3.4.13/lib/libopencv_cudaarithm.so.3.4 (0x00007fcf74bed000)
原因分析
这种情况的核心是CUDA相关库属于间接依赖,而非程序直接链接的库:
- 你直接链接的opencv_core、opencv_imgproc等基础库,它们的路径已经通过
-Wl,-rpath写入了程序的动态链接信息,所以加载器能通过程序自身的rpath找到这些库。 - 而opencv_cudaimgproc、opencv_cudaarithm这类CUDA库,是被基础库间接引用的,但这些基础库在编译OpenCV时,没有把OpenCV的库路径添加到自身的rpath中。
- 动态加载器解析间接依赖时,只会使用程序的rpath、系统默认路径和
LD_LIBRARY_PATH。由于基础库自身不带rpath信息,加载器无法通过程序的rpath找到这些CUDA库,只能依赖LD_LIBRARY_PATH来补全路径。
无需依赖LD_LIBRARY_PATH的解决方法
- 重新编译OpenCV并添加rpath:编译OpenCV时,通过
CMAKE_INSTALL_RPATH参数指定库安装路径,让所有OpenCV库(包括CUDA库)都携带正确的rpath信息。这样后续你的程序链接后,加载器能通过基础库的rpath自动找到CUDA库。 - 显式链接CUDA库:在你的程序链接命令中,直接添加
-lopencv_cudaarithm、-lopencv_cudaimgproc等CUDA库,让这些库的路径被写入程序的rpath,加载器就能直接定位它们。
内容的提问来源于stack exchange,提问作者Arik Vasserman
相关产品推荐
相关产品推荐

