多语言展示
当前在线:1823今日阅读:27今日分享:41

解决MATLAB编译问题mex error C2668:“log”

从Mathworks论坛下载了一个计算互信息的程序包,想直接用,但由于该程序包基于32位系统编译,生成的.mexglx在64位电脑上无法调用,因此需要重新编译。在64位使用MATLAB编译C++文件(.cpp文件)时报错如下:错误使用 mex error C2668: “log”: 对重载函数的调用不明确制作本经验用于分享根据MATLAB报错提示解决问题的思路。(解决方法对编译C文件(.c)同样有效)
工具/原料
1

MATLAB 2014a

2

Win 10 64位系统

方法/步骤
1

首先将下载的程序包解压到目标路径,并将MATLAB的工作路径设置成跟解压文件目录一致。

2

创建变量X和变量Y,测试程序是否能正常运行并跑出结果;错误提示:未定义与 'double' 类型的输入参数相对应的函数 'estpab'。说明MATLAB运行目录下不存在可调用的estpab程序文件,但是检查文件目录发现这一函数是有的,所以说明这个函数的cpp没有成功编译。调研后发现,如图所示的三种文件版本比较旧,而且基于32位系统生成,不适用于WIN 10 64位系统的MATLAB 2014a软件版本。

3

重新对程序包中的所有cpp文件进行编译(使用mex命令):执行 mex estpab.cpp, 成功;执行 mex estcondentropy.cpp,失败,错误提示:错误使用 mexestcondentropy.cppF:\2spectranalysis\estcondentropy.cpp(33) : warning C4267: “初始化”: 从“size_t”转换到“long”,可能丢失数据F:\2spectranalysis\estcondentropy.cpp(34) : warning C4267: “初始化”: 从“size_t”转换到“long”,可能丢失数据F:\2spectranalysis\estcondentropy.cpp(37) : warning C4267: “初始化”: 从“size_t”转换到“long”,可能丢失数据F:\2spectranalysis\estcondentropy.cpp(65) : error C2668: “log”: 对重载函数的调用不明确        E:\visualstudio\VC\INCLUDE\math.h(575): 可能是“long double log(long double)”        E:\visualstudio\VC\INCLUDE\math.h(527): 或       “float log(float)”        E:\visualstudio\VC\INCLUDE\math.h(120): 或       “double log(double)”        尝试匹配参数列表“(int)”时其中只有error提示比较重要,下面重点讲如何根据提示解决error。

4

error显示log函数调用出了问题,下面紧跟着提示可能是long double log (long double)....,这说明,应该是log函数的输入或输出变量的数据类型有问题。双击查看estcondentropy.cpp,按照提示找到错误代码行65,发现log函数的输入是一个整型常量“2”,这样我们就找到了问题症结。将“2”改为“2.00”,意义在于将输入参数的数据类型由整型改为了浮点型。

5

再次执行编译命令,显示编译成功。依次对本程序包中的所有cpp文件进行编译,编译后每个cpp文件都生成一个对应的.mexw64文件,这时可以删掉所有的.cpp和.h文件,因为MATLAB调用的是这个.mexw64文件,只要保留这个文件和.m文件即可。再次运行程序包的主函数(就是所有其他函数程序都编译好后,它才能运行的函数),本例中为mutualinfo函数执行:mutualinfo(X,Y)  输出结果,证明程序调用成功,这一程序包是可用的。

注意事项

本经验仅提供错误解决的思路,针对具体错误,本经验只为error C2668: 'log', 对重载函数调用不明确这一问题提供解决方案

推荐信息