【发布时间】:2011-01-30 21:39:46
【问题描述】:
使用 Visual C++ 2010 的编译器 (cl.exe) 从 mex 中的 third-party library 编译 C++ 文件时遇到以下问题。
编译器在如下语句中多行抱怨::
plhs[i] = mxCreateNumericMatrix(nclass, 1, mxDOUBLE_CLASS, 0);
与:
错误 C2664: 'mxCreateNumericMatrix_730':不能 将参数 4 从“int”转换为 'mx复杂度'
原因似乎是mxCreateNumericMatrixtakes是一个枚举类型作为输入参数4,称为mxComplexity,即defined作为typedef enum mxComplexity {mxREAL=0, mxCOMPLEX};。换句话说,编译器抱怨它不能从 int 隐式转换为 enum 类型。
有趣的是,library in question 应该可以轻松编译,而无需更改其中的任何内容。
因此,我的问题是:有没有办法告诉 mex、cl.exe(或 >gcc,如果我在 Unix 中这样做),我想做一个 C 风格 类型的隐式转换?
注意 1: 不幸的是,我不知道该库是按照什么 C++ 标准编写的。
注意 2: 以防万一,这是我对 mex 的配置(默认情况下由 MATLAB 设置,在运行 mex -setup 之后):
CompilerExecutable: 'cl'
CompilerFlags: '/c /Zp8 /GR /W3 /EHs /D_CRT_SECURE_NO_DEPRECATE /D_SCL_SECURE_NO_DEPRECATE /D_SECURE_SCL=0 /DMATLAB_MEX_FILE /nologo /MD'
OptimizationFlags: '/O2 /Oy- /DNDEBUG'
DebugFlags: '/Z7'
LinkerExecutable: 'link'
LinkerFlags: '/dll /export:%ENTRYPOINT% /LIBPATH:"%LIBLOC%" libmx.lib libmex.lib libmat.lib /MACHINE:X64 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /manifest /incremental:NO /implib:"%LIB_NAME%.x" /MAP:"%OUTDIR%%MEX_NAME%%MEX_EXT%.map"'
LinkerOptimizationFlags: ''
LinkerDebugFlags: '/debug /PDB:"%OUTDIR%%MEX_NAME%%MEX_EXT%.pdb"'
【问题讨论】:
-
也许是个愚蠢的问题,但为什么要使用文字 0 而不是 mxREAL?
-
@Christoffer,这是一个很好的问题,但我不知道为什么库开发人员选择使用文字而不是枚举类型。无论如何,如果可以避免的话,我宁愿不更改库的源代码。
-
@AmV:似乎他们确实为 Win32 和 64 位提供了预编译的二进制文件:code.google.com/p/randomforest-matlab/downloads/list
-
@Amro,感谢您对此进行调查,但我仍然感到困惑。 @Alex 在下面说 C++ 不允许隐式转换(证实了我最初的猜测)。您之前仍然说过您设法编译了旧版本的库(具有隐式转换的库)。库附带的编译脚本使用 cl.exe(当它看到 .Cpp 扩展名时默认为 C++)和 g++(而不是 gcc)。
-
@AmV: 既然我明白了这个问题,我和你一起困惑......举个简单的例子:pastebin.com/fmJqkdir,这个程序可以正确编译为 C,但会抛出编译错误作为 C++(但不知何故,
mex在旧版本的库中是成功的,至少对我来说是这样!)
标签: c++ c visual-studio-2010 matlab g++