У меня следующая проблема при компиляции файла C ++ из сторонней библиотеки в mex с использованием компилятора Visual C ++ 2010 (cl.exe).
компилятор жалуется в несколько строк на оператор, подобный следующему: *
plhs[i] = mxCreateNumericMatrix(nclass, 1, mxDOUBLE_CLASS, 0);
с:
ошибка C2664: 'mxCreateNumericMatrix_730': невозможно преобразовать параметр 4 из 'int' в 'mxComplexity '
причина, по-видимому, заключается в том, что mxCreateNumericMatrix
принимает тип перечисления в качестве входного аргумента 4 , называемый mxComplexity
, то есть определено как typedef enum mxComplexity {mxREAL=0, mxCOMPLEX};
.Другими словами, компилятор жалуется, что не может неявно преобразовать из int в тип перечисления .
Интересно, что рассматриваемая библиотека должна легко компилироваться без необходимости что-либо менять в ней.
Поэтому мой вопрос: вместо добавления явного преобразования вв каждой строке, где это происходит, есть ли способ сообщить mex , cl.exe (или gcc , если бы я делал это в Unix), чтоЯ хочу сделать неявное преобразование типа C-style ?
Примечание 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"'