我们使用脚本环境来自动构建,运行和验证独立的可执行文件 . 我们正在使用Matlab R2010a x64 . 从构建独立应用程序的Windows命令行调用Matlab编译器mcc:
mcc -m -v -w enable -I source_folder -I common_folder -a specific_files_we_need our_program
该程序包含大约25个模块(.m文件),并使用大约5个工具箱 . 只要有正确的许可证,这项工作正常 . mcc检查可用的编译器许可证,解析依赖关系,打包可执行文件中的所有内容 .
但是,如果许可证不包含所需的工具箱,则mcc不会发出任何警告或错误 . 它在没有工具箱的情况下构建可执行文件 . 因此,可执行文件启动,似乎第一眼就会运行,但如果需要工具箱的代码行已经崩溃,则会崩溃 .
我期望从编译器中通知我有关缺少组件的信息 . 我该怎么做才能了解缺失的组件?如何确保mcc不会将不完整的可执行文件放在一起?我在调用mcc时遗漏了什么?
最好我想以一种方式设置编译,如果缺少它就会停止 .
\ Zweikeks
3 回答
最简单的方法是在编译脚本中检查所需的许可证,即
您只需添加需要签出的5个工具箱 - >如果许可证功能无法签出许可证,则返回false,然后您可以使用该工具箱中止编译 .
这就是我最终提出的:
我可以在编译之前检查需要哪些工具箱并相应地调用license() . 或者我可以对可执行文件本身实现内置检查 . (在编译后使用特殊参数调用会触发对可用工具箱的自检 . )在任何一种情况下,我都需要所需工具箱的名称 .
我尝试了几种方法来生成工具箱列表 . 简而言之:在Matlab中运行程序然后输入许可证('inuse')并不是非常可靠 . depfun()下降到很多 . mydepfun()和fdep()不够下降 .
我认为mydepfun()和fdep()的问题是它们不会进入\ toolbox \ shared文件夹 . 所以我从Tobias Kienzler (link to the original sources)拿了mydepfun()并修改它:
这样i_scan(f)就会返回工具箱,也会进入\ toolbox \ shared . mydepfun()的主要功能只是收集工具箱:
列出的工具箱是我们的源代码使用的工具箱 . 修改后的mydepfun()似乎工作正常 . (除了仅在运行时解析的元素引起的典型问题,如eval(),函数句柄,回调等)
而且:我所看到的依赖性步行者 - 比如mydepfun() - 正在使用depfun() . depfun()不可靠,因为它默默地忽略了不在路径上的所有源代码(在这种情况下它的返回prob_files也是空的) . 因此必须注意正确设置Matlab路径 . (此外,任何其他方法都有问题,因为Matlab可能会从其他位置使用相同名称的意外函数 . )
毕竟,我认为,这是使我的构建过程更可靠的好方法 .
/ Zweikeks
我刚刚从Mathworks论坛得到了另一个提示 . 编译器写出mccExludedFiles.log . 这是列出缺少的工具箱 . 例如
(但是,源代码中的其他缺少的文件不会列出 . )
/ Zweikeks