在Ubuntu中,c++调用matlab引擎(入门实例:http://www.linuxdiyf.com/linux/26372.html),已经设置好了库文件的查找路径,但是编译时还是报错:
$ g++ matlab_eigen.cpp -o matlab_eigen -I/opt/MATLAB/R2012a/extern/include -L/opt/MATLAB/R2012a/bin/glnxa64
/tmp/cccXS6eb.o: In function `main':
matlab_eigen.cpp:(.text+0xe): undefined reference to `engOpen'
matlab_eigen.cpp:(.text+0x52): undefined reference to `engEvalString'
matlab_eigen.cpp:(.text+0x63): undefined reference to `engEvalString'
matlab_eigen.cpp:(.text+0x74): undefined reference to `engEvalString'
matlab_eigen.cpp:(.text+0x85): undefined reference to `engEvalString'
collect2: ld returned 1 exit status
原因:缺少需要的链接库:
在windows下:libeng.lib libmx.lib libmex.lib libmat.lib (依次对应-llibeng -llibmx -llibmex -llibmat)
在Linux下:libeng.so,libmx.so libmex.so libmat.so (依次对应的库名是:eng, mx, mex, mat),Linux库命名规则详情见附[1]。
解决方法:
用-l链接到这些动态库就行。即:
$ g++ matlab_eigen.cpp -o matlab_eigen -I/opt/MATLAB/R2012a/extern/include -L/opt/MATLAB/R2012a/bin/glnxa64 -leng -lmx
比如,“-leng”就告诉gcc在链接阶段引用共享函数库libeng.so。对此更详细的描述可以点这里。
注意:windows和Linux库是不兼容的,命名规则也不一样,不要弄混了把windows的库名用在了linux上,linux系统是无法找到库的,比如上面的编译语句如果这样写:
$ g++ matlab_eigen.cpp -o matlab_eigen -I/opt/MATLAB/R2012a/extern/include -L/opt/MATLAB/R2012a/bin/glnxa64 -llibeng -llibmx
g++编译器就会报这个错误:
/usr/bin/ld: cannot find -llibeng
/usr/bin/ld: cannot find -llibmx
collect2: ld returned 1 exit status
关于库的命名,附[1]有更详细的说明。
附[1]: