Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ MATLAB+;Mex+;OpenCV:链接和编译正确,但可以';无法在运行时找到库_C++_Matlab_Opencv_Mex - Fatal编程技术网

C++ MATLAB+;Mex+;OpenCV:链接和编译正确,但可以';无法在运行时找到库

C++ MATLAB+;Mex+;OpenCV:链接和编译正确,但可以';无法在运行时找到库,c++,matlab,opencv,mex,C++,Matlab,Opencv,Mex,我有一个mex函数,它使用我正在尝试使用的OpenCV。编译似乎可以工作,但当我尝试在MATLAB中调用函数时,我得到以下错误: Invalid MEX-file '/path/to/project/mexfunction.mexa64': libopencv_legacy.so.2.4: cannot open shared object file: No such file or directory 我的opencv2.4.5安装位于/nwdata/username/(我使用他们文档中的O

我有一个
mex
函数,它使用我正在尝试使用的
OpenCV
。编译似乎可以工作,但当我尝试在
MATLAB
中调用函数时,我得到以下错误:

Invalid MEX-file '/path/to/project/mexfunction.mexa64': libopencv_legacy.so.2.4: cannot open shared object file: No such file or directory
我的
opencv2.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)

好的,看来没问题。该文件确实存在:

[username@machine:/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


[username@machine:/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上运行:

Linuxmachine@redacted2.6.43.8-1.fc15.x86#1 SMP周一6月4日20:33:44 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux

MatlabR2011B和g++4.6.3.


这似乎很奇怪。有什么想法吗?这台机器是群集的一部分,因此我没有根访问权限或其他任何权限。

几天前我遇到了类似的问题。只有在集群上远程使用matlab时,才会出现此问题。在Matlab中编辑LD_库_文件是无用的,我不知道为什么。我通过在.bashrc(或.bash_配置文件)中定义LD_LIBRARY_路径解决了这个问题。

几天前我遇到了类似的问题。只有在集群上远程使用matlab时,才会出现此问题。在Matlab中编辑LD_库_文件是无用的,我不知道为什么。我通过在.bashrc(或.bash_profile)中定义LD_LIBRARY_路径解决了这个问题。

我遇到了一个非常类似的问题,并通过向Matlab binaries目录中丢失的库添加一个软链接解决了这个问题,在我的例子中,所有其他lib都位于该目录中:

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

解决了这个问题。

我遇到了一个非常类似的问题,通过向Matlab binaries目录中丢失的库添加一个软链接解决了这个问题,在我的例子中,所有其他库都位于该目录中:

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

已解决问题。

检查路径和LD_LIBRARY_路径环境该目录不在我的shell或MATLAB路径上。这是LD_库路径:
>getenv('LD_库路径')
ans=/usr/local/matlab2011b/sys/os/glnxa64:/usr/local/matlab2011b/bin/glnxa64:/usr/local/matlab2011b/extern/lib/glnxa64:/usr/local/matlab2011b/usr/local/glnxa64/sys/java/jre/glnxa64/native_线程:/usr/local/matlab2011b/sys/jre/glnxa64/jre/jre/lib/amd64/server:/usr/local/matlab2011b/jre/jre/jre/jre/jre/jre/jrad64/jre/amd64
你能把它添加到ld-lib路径吗?我这样做了:
p=getenv('ld\u-LIBRARY\u-path');p=[p':/nwdata/username/lib'];setenv('LD_LIBRARY_PATH',p)再次检查它,它是路径上的最后一项。同样的事情,即使在重新编译后仍然不起作用。还做了一个
addpath('/nwdata/username/lib')
,但仍然不行。您还可以通过调用
LD\u PRELOAD=/path/to/lib来使用
LD\u PRELOAD
,从而启动matlab。无关:签出项目检查路径和LD_LIBRARY_路径环境该目录不在my shell或MATLAB路径上。这是LD_库路径:
>getenv('LD_库路径')
ans=/usr/local/matlab2011b/sys/os/glnxa64:/usr/local/matlab2011b/bin/glnxa64:/usr/local/matlab2011b/extern/lib/glnxa64:/usr/local/matlab2011b/usr/local/glnxa64/sys/java/jre/glnxa64/native_线程:/usr/local/matlab2011b/sys/jre/glnxa64/jre/jre/lib/amd64/server:/usr/local/matlab2011b/jre/jre/jre/jre/jre/jre/jrad64/jre/amd64
你能把它添加到ld-lib路径吗?我这样做了:
p=getenv('ld\u-LIBRARY\u-path');p=[p':/nwdata/username/lib'];setenv('LD_LIBRARY_PATH',p)再次检查它,它是路径上的最后一项。同样的事情,即使在重新编译后仍然不起作用。还做了一个
addpath('/nwdata/username/lib')
,但仍然不行。您还可以通过调用
LD\u PRELOAD=/path/to/lib来使用
LD\u PRELOAD
,从而启动matlab。无关:签出项目