Ubuntu下编译matlab eigen时: undefined reference to `engOpen'

时间:2021-10-30 05:30:16
在Ubuntu中,c++调用matlab引擎( 入门实例点这里),已经设置好了库文件的查找路径,但是编译时还是报错:
$ 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库命名规则详情点( 这里)。

解决方法:
用-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

关于库的命名,(这里)有更详细的说明。


参考:
http://*.com/questions/7757613/calling-matlab-from-c