2013-07-15 55 views
1

我有一個mex函數,它使用我試圖使用的OpenCV。編譯似乎工作,但是當我嘗試和內MATLAB調用函數我得到這個錯誤:MATLAB + Mex + OpenCV:鏈接和編譯正確,但在運行時無法找到庫

Invalid MEX-file '/path/to/project/mexfunction.mexa64': libopencv_legacy.so.2.4: cannot open shared object file: No such file or directory 

OpenCV 2.4.5安裝位於/nwdata/username/(我整理自己從使用OpenCV的從無到有,從他們的文檔推薦設置) 。我使用這個函數與mex編譯:

function cvmex(mexfile) 
    OCV_INC_DIR='/nwdata/username/include/opencv';· 
    OCV2_INC_DIR='/nwdata/username/include';· 
    OCV_LIB_DIR ='/nwdata/username/lib';· 

    mex(mexfile,'-g','-v',['-I',OCV2_INC_DIR],['-I',OCV_INC_DIR],['-L',OCV_LIB_DIR],'DUSE_DOUBLE',... 
    '-lopencv_legacy','-lopencv_imgproc','-lopencv_core','-lopencv_contrib','-lopencv_ml',... 
    '-lopencv_objdetect','-lopencv_calib3d','-lopencv_flann','-lopencv_features2d',... 
    '-lopencv_video','-lopencv_gpu'); 
end 

當我編譯時,我沒有得到任何錯誤。然後我查看了庫的依賴關係是什麼ldd mexfunction.mexa64。下面是相關線路:

libopencv_legacy.so.2.4 => /nwdata/username/lib/libopencv_legacy.so.2.4 (0x00002ad6a2123000)

好了,這似乎好。這個文件肯定存在:

[[email protected]:/nwdata/username/lib] 
$ ls -l libopencv_legacy* 
lrwxrwxrwx 1 username REDACTED  25 Jul 15 15:07 libopencv_legacy.so -> libopencv_legacy.so.2.4.5 
lrwxrwxrwx 1 username REDACTED  25 Jul 15 15:07 libopencv_legacy.so.2.4 -> libopencv_legacy.so.2.4.5 
-rwxr-xr-x 1 username REDACTED 1303944 Jun 17 15:37 libopencv_legacy.so.2.4.5 


[[email protected]:/nwdata/username/lib] 
$ file libopencv_legacy.so* 
libopencv_legacy.so:  symbolic link to `libopencv_legacy.so.2.4.5' 
libopencv_legacy.so.2.4: symbolic link to `libopencv_legacy.so.2.4.5' 
libopencv_legacy.so.2.4.5: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, not stripped 

在Linux上運行:

Linux [email protected] 2.6.43.8-1.fc15.x86_64 #1 SMP Mon Jun 4 20:33:44 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux

MATLAB R2011b, and g++ 4.6.3.

這似乎很奇怪。有任何想法嗎?這臺機器是集羣的一部分,所以我沒有root權限或任何東西。

+0

檢查路徑和LD_LIBRARY_PATH環境 – Shai

+0

該目錄不在我的shell或MATLAB路徑中。這裏是LD_LIBRARY_PATH: '>> GETENV( 'LD_LIBRARY_PATH')'' ANS = 在/ usr /本地/ matlab2011b/SYS/OS/glnxa64:在/ usr /本地/ matlab2011b /斌/ glnxa64:在/ usr /本地/ matlab2011b /的extern/lib中/ glnxa64:在/ usr /本地/ matlab2011b /運行/ glnxa64:在/ usr /本地/ matlab2011b/SYS/JAVA/JRE/glnxa64/JRE/lib目錄/ AMD64/native_threads:在/ usr /本地/ matlab2011b/sys/java/jre/glnxa64/jre/lib/amd64/server:/ usr/local/matlab2011b/sys/java/jre/glnxa64/jre/lib/amd64' – NOP

+0

您可以將它添加到ld lib路徑嗎? – Shai

回答

1

前幾天我遇到了類似的問題。只有在羣集上遠程使用matlab時纔會出現此問題。在Matlab中編輯LD_LIBRARY_FILE是無用的,我不知道爲什麼。我通過在.bashrc(或.bash_profile)中定義LD_LIBRARY_PATH來解決問題。

0

我有一個非常類似的問題,並通過添加軟鏈接到丟失的庫在Matlab二進制文件的目錄,在所有其他庫中的位置,在我的情況下,解決了這個問題:

sudo ln -s /users/marc/lib/libName.so /opt/matlab/MATLAB_R2014b_Linux_x86-64/bin/glnxa64/libName.so 

解決的問題。