Ubuntu18.04 Eclipse中C++调用Matlab编译共享库报错求解决方案
解决Matlab编译的C++共享库调用时的未定义引用问题
首先,你遇到的这些未定义引用错误本质是编译链接阶段没有正确关联Matlab Runtime提供的核心库,以及你自己生成的libtestAdd.so库。咱们一步步来解决:
1. 先修正测试代码里的笔误
你的代码里有两个明显的变量名错误,会导致编译前的语法问题:
// 原错误代码 input_A.SetData(M,1); input_B.SetData(K,1); // 修正为(M替换成A,K替换成B) input_A.SetData(A,1); input_B.SetData(B,1);
2. 使用正确的编译链接命令
你当前的编译命令g++ main.cpp -o main只编译了源代码,但没有链接任何依赖库。需要添加参数指定头文件路径、库路径以及要链接的库:
完整编译命令示例
g++ main.cpp -o main \ -I/usr/local/MATLAB/MATLAB_Runtime/v95/extern/include \ -L/usr/local/MATLAB/MATLAB_Runtime/v95/runtime/glnxa64 \ -L/home/csrl/Desktop/libtestAdd/for_testing \ -ltestAdd -lmclmcrrt -lmclcpplib
参数解释:
-I:指定头文件搜索目录,这里直接指向Matlab Runtime的include文件夹(不用再手动复制头文件了)-L:指定库文件搜索目录,分别添加Matlab Runtime的库目录和你生成的libtestAdd.so所在目录-l:指定要链接的库,顺序很重要:ltestAdd:链接你自己生成的加法库(注意去掉前缀lib和后缀.so)lmclmcrrt:Matlab Runtime核心运行库lmclcpplib:Matlab的C++接口支持库,对应mwArray这些类的实现
3. 确保环境变量生效
你已经在/etc/profile里配置了LD_LIBRARY_PATH,但要注意:
- 配置后需要执行
source /etc/profile让当前终端生效,或者重启终端 - 如果运行时还是提示找不到库,可以在运行前临时指定:
export LD_LIBRARY_PATH=/usr/local/MATLAB/MATLAB_Runtime/v95/runtime/glnxa64:/usr/local/MATLAB/MATLAB_Runtime/v95/bin/glnxa64:/usr/local/MATLAB/MATLAB_Runtime/v95/sys/os/glnxa64:$LD_LIBRARY_PATH ./main
4. 额外检查项
- 确认你的Matlab Runtime版本(R2018b对应v95)和编译库时用的Matlab版本一致,版本不匹配会导致兼容性问题
- 确保
libtestAdd.so的权限是可执行的(可以用chmod +x libtestAdd.so调整)
按照上面的步骤操作后,应该就能成功编译并运行你的测试程序了。
内容的提问来源于stack exchange,提问作者Dejiang Piao
相关产品推荐
相关产品推荐

