起因:
程序主体是Java,其中高斯函数的拟合计算部分使用了Matlab程序打包的jar,操作时将程序移植到另一台电脑上并出现了很多问题。
现总结如下:
问题1:Failed to find the required library mclmcrrt9_6.dll on java.library.path。
解决方法:
1)保证jdk版本与matlab的java版本一致
a.jdk版本既不能高,也不能低,到最新的matlabR2022b为止,其Java版本还是1.8,可以从网站上下载1.8版本的jdk,1.8后面的数字差异可以不用考虑 ;
b.按照初学Java时配置环境变量的步骤,将jdk1.8作为操作系统中的Java版本
c.也可以根据IDE操作,比如在创建项目时,将本项目的library特别设定为jdk1.8版本;
2) 确保安装mcr运行环境,即mcrinstaller
具体而言,步骤如下:
a.安装Matlab,并在命令行输入mcrinstaller,系统通常会显示缺少必要的工具,如matlab compiler和matlab compiler sdk,下载matlab compiler即可。
b.再次在命令行中输入mcrinstaller,这时会显示matlab安装路径下没有mcrinstaller,同时会给出compiler.runtime.download,输入命令后即可开始下载,需要等待一些时间。
这里需要注意的是,runtime版本与matlab版本是对应的,采用高版本的runtime是无法编译成功的
c.解压下载完成的压缩包,并将其配置到环境变量中,如下图为本机runtime压缩包解压后的状态,将目录上的路径配置到环境变量即可。
如此,问题1基本上就可以解决了。
问题2:错误使用 message/getString....
解决方法:
这个问题在检索时并未找到,通常这种问题都不是Eclipse程序存在的问题,除非上述问题1中的环境没有配置好,因此通常代表的是Matlab程序存在的问题。
出现这个报错信息的原因是,Matlab程序导入的文件不存在,只需要将文件放入路径即可。
问题3:'optimlib:commonMsgs'与‘optimlib:snls’......
解决方法:
出现这类报错问题时,通常会有大篇幅的红色信息,其实根据这些简短的内容也可以有所判断。
通常Eclipse调试过程中,是不会出现optimlib的报错信息的,因此基本上可以锁定问题出现在Matlab源程序上。
本人在调试过程中,深陷于思维定式,将重点放在了Eclipse调用Matlab程序的方法上,认为程序报错和Matlab源代码无关,而与Eclipse如何调用Matlab程序有关,
因此最佳的解决方法就是,找到Matlab的源码并重新进行调试。
在调试过程中,Matlab环境编译报错给出的问题是,缺少了optimal toolbox,这也与上面的optimlib的报错对应起来了。
总结一下:
调试这个程序花费了本人几个小时的时间,不过这几个小时是有价值的。
具体表现在,首先,runtime的版本需要和Matlab对应,而不是考虑向下兼容。
其次,考虑混合编程问题时,先排除源码可能存在的问题,接着在考虑调用的问题,最后考虑编译环境本身的问题。
这样的顺序其实是有逻辑在其中的,
通常应用混合编程时,主体程序是我们非常熟悉的,例如Java、C或者C++等,而混合编程部分通常是我们不那么熟悉的语言,如python、Matlab等,
(1)先考虑源码的问题,也就从相对的难易程度上排除了报错的可能,因为我们的的错误很可能出现在源码的编写上,这也容易成为我们的盲区而浪费后续的大量时间。
(2)再考虑混合编程的调用问题,这一点看似比(1)要复杂,但(1)是真正排查编程盲区时需要注意的内容;如果(1)可以顺利解决,那么就更有精力攻克(2)的问题。
本人先后尝试过将Java和Matlab以及Python混合编程的经历,其中与python混合编程要相当容易,通过在maven中引入依赖可以解决问题,而Matlab则涉及到了jdk版本还有打包的问题,因此更为复杂,操作步骤中也要非常上心。
(3)最后考虑主体程序存在的问题,通常主体的代码我们更为熟悉,因此调试起来也会更加轻松。