一个以前用得好好的DeviceQuery.mexw64程序,在Matlab2022a里就不能运行了。提示信息是:
“MEX 文件 'E:\Temp\DeviceQuery.mexw64' 无效: 找不到指定的模块。”
文件在正确的路径里,但Matlab就是不认。操作系统是Windows10。查了些文章,说要重新编译才能在这个版本的Matlab里用。
用mex重新编译C++文件的时候,又出了新的问题,报了一个错误,有些乱码方块在里面,估计是中文。
E:\Temp\Matlab\DeviceQuery.cpp(111): error C2664: ��int MultiByteToWideChar(UINT,DWORD,LPCCH,int,LPWSTR,int)��:
�������� 5 �ӡ�mxChar *��ת��Ϊ��LPWSTR��
这是编译器的错误提示信息,为了搞清楚提示是什么内容,就要让Matlab正确显示这些字符。估计问题在于UTF编码与GBK编码不兼容。首先用feature('locale')命令,看Matlab的编码,显示如下:
feature('locale')
ans =
包含以下字段的 struct:
ctype: 'zh_CN.UTF-8'
collate: 'zh_CN.UTF-8'
time: 'zh_CN.UTF-8'
numeric: 'en_US_POSIX.UTF-8'
monetary: 'zh_CN.UTF-8'
messages: 'zh_CN.UTF-8'
encoding: 'UTF-8'
terminalEncoding: 'GBK'
jvmEncoding: 'UTF-8'
status: 'MathWorks locale management system initialized.'
warning: ''
果然Matlab的编码是UTF-8,而不是GBK。MATLAB读取区域设置只是跟Windows系统区域中的“格式(Format)”设置有关,但试了很多办法,都不能让UTF-8转成GBK编码。最后,只好转个思路,让中文编码不用GBK,而是改用用UTF格式。在系统区域设置中的核选框打勾,如下图,然后重启系统。
再用mex编译时,错误信息终于显示出来了:
E:\Temp\DeviceQuery.cpp(107): error C2664: “int MultiByteToWideChar(UINT,DWORD,LPCCH,int,LPWSTR,int)”: 无法将
参数 5 从“mxChar *”转换为“LPWSTR”
这是新版的Matlab重新定义了mxChar,强制类型转换后,编译顺利通过。执行程序,一切正常。