Linux下MATLAB MCC多M文件可执行文件内部函数调用报错解决
解决MATLAB MCC编译多M文件运行时的大小写匹配错误
问题背景
在Linux环境下使用mcc编译多M文件生成可执行文件:
- 原M文件:定义
functionXYZ(a1, a2, a3)函数 - Wrapper M文件:作为入口点,加载MAT工作区文件并调用原函数,代码如下:
function res = functionXYZWrapper(workspace) load(workspace); res = functionXYZ(a1, a2, a3); end
执行编译命令:
mcc -mv tests/functionXYZ/functionXYZWrapper.m functionXYZ.m
运行生成的run_functionXYZWrapper.sh时出现错误:
Cannot find an exact (case-sensitive) match for 'functionXYZ' The closest match is: functionXYZ in /home/user/.mcrCache9.4/getMid1/functionXYZ.m Error in functionXYZWrapper (line 3) MATLAB:dispatcher:InexactCaseMatch
用户需搭建CI流水线,不想绑定MAT文件的原因:
- 无需修改原函数代码结构来加载MAT文件
- 避免每次测试都单独编译可执行文件,实现wrapper动态加载不同MAT文件
- 减少CI流水线中容器镜像构建的负载
解决方案
1. 严格核对函数名大小写一致性
MATLAB编译后的MCR环境对函数名大小写完全敏感,即使提示有相近匹配,也必须确保:
- Wrapper中调用的
functionXYZ与原M文件中的函数定义完全一致(包括每个字母的大小写) - 原M文件的文件名与函数名完全一致(比如原函数是
functionXYZ,文件名必须是functionXYZ.m,不能是FunctionXYZ.m)
2. 编译时指定原函数的完整路径
编译时如果原functionXYZ.m不在当前工作目录,需指定完整路径,确保mcc正确包含该文件:
mcc -mv tests/functionXYZ/functionXYZWrapper.m /full/path/to/functionXYZ.m
3. 在Wrapper中显式添加路径
在Wrapper函数开头添加路径,确保MCR运行时能找到原函数:
function res = functionXYZWrapper(workspace) % 添加当前目录到搜索路径 addpath(pwd); % 若原函数在特定目录,可直接添加该目录 % addpath('/full/path/to/directory-containing-functionXYZ'); load(workspace); res = functionXYZ(a1, a2, a3); end
修改后重新编译即可,这样编译后的可执行文件能动态加载不同的MAT文件,无需重复编译。
4. 清理MCR缓存目录
错误提示中提到了MCR缓存路径,旧缓存可能导致路径冲突,删除缓存后重新运行:
rm -rf /home/user/.mcrCache9.4/getMid1/ ./run_functionXYZWrapper.sh /usr/local/MATLAB/R2018a/ ../test.mat
内容的提问来源于stack exchange,提问作者rbaleksandar
相关产品推荐
相关产品推荐

