Если бы вы включили больше сообщения об ошибке, я думаю, что это
уже ответили, просто к вашему сведению. Похоже, вы компилируете файл
из какого-то нематлабного источника, это нормально, но вам, вероятно, придется
дать больше информации об этом. Похоже, что файл features.cc
ссылаясь на символ round
, поэтому вы получаете ошибку. Тебе понадобиться
предоставить библиотеку для функции или скомпилировать ее из исходного кода. Если вы делаете
help mex
, он должен быть в состоянии дать вам информацию о компоновщике библиотеки
команды -L
для пути и -l
для библиотеки. Кажется, я помню, что
эта функция не работает так, как рекламируется, и требует использования
-lC:/path/to/library/libfile.lib
или что угодно. Прежде всего, я бы порекомендовал
составление yprime
примера из справки Matlab. Это гарантирует, что вы
правильно настройте компилятор, что звучит так же, как и вы. Кроме того, возьмите
посмотрите на файл yprime.c и mexFunction
. Вы можете убедиться, что
Компилятор примет файл .cc
как файл C. Это может интерпретировать это как C ++
файл, который вызовет у вас больше головной боли. Вы можете переименовать файл yprime.c
на yprime.cc
только для проверки идеи.
EDIT
Спасибо за предоставление кода. Это должен быть торт, мой друг, полный торт. : -)
Это моя ошибка, которую я получаю, когда пытаюсь скомпилировать, используя:
Microsoft Visual C++ 2008 Express
>> mex -v -g features.c
This is mex, Copyright 1984-2007 The MathWorks, Inc.
-> Default options filename found in C:\Documents and Settings\wynkocl\Application\Data\MathWorks\MATLAB\R2009b
----------------------------------------------------------------
-> Options file = C:\Documents and Settings\wynkocl\Application Data\MathWorks\MATLAB\R2009b\mexopts.bat
MATLAB = C:\MATLAB\R2009B~1
-> COMPILER = cl
-> Compiler flags:
COMPFLAGS = /c /Zp8 /GR /W3 /EHs /D_CRT_SECURE_NO_DEPRECATE /D_SCL_SECURE_NO_DEPRECATE /D_SECURE_SCL=0 /DMATLAB_MEX_FILE /nologo /MD
OPTIMFLAGS = /O2 /Oy- /DNDEBUG
DEBUGFLAGS = /Z7
arguments =
Name switch = /Fo
-> Pre-linking commands =
-> LINKER = link
-> Link directives:
LINKFLAGS = /dll /export:mexFunction /LIBPATH:"C:\MATLAB\R2009B~1\extern\lib\win32\microsoft" libmx.lib libmex.lib libmat.lib /MACHINE:X86 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 /incremental:NO /implib:"C:\DOCUME~1\WYNKOCL\LOCALS~1\TEMP\MEX_7L~1\templib.x" /MAP:"features.mexw32.map"
LINKDEBUGFLAGS = /DEBUG /PDB:"features.mexw32.pdb"
LINKFLAGSPOST =
Name directive = /out:"features.mexw32"
File link directive =
Lib. link directive =
Rsp file indicator = @
-> Resource Compiler = rc /fo "mexversion.res"
-> Resource Linker =
----------------------------------------------------------------
--> cl /c /Zp8 /GR /W3 /EHs /D_CRT_SECURE_NO_DEPRECATE /D_SCL_SECURE_NO_DEPRECATE /D_SECURE_SCL=0 /DMATLAB_MEX_FILE /nologo /MD /FoC:\DOCUME~1\WYNKOCL\LOCALS~1\TEMP\MEX_7L~1\features.obj -IC:\MATLAB\R2009B~1\extern\include -IC:\MATLAB\R2009B~1\simulink\include /Z7 -DMX_COMPAT_32 features.c
features.c
features.c(27) : error C2059: syntax error : 'type'
features.c(28) : error C2059: syntax error : 'type'
features.c(92) : warning C4013: 'round' undefined; assuming extern returning int
C:\MATLAB\R2009B~1\BIN\MEX.PL: Error: Compile of 'features.c' failed.
Аааа ... теперь мы можем найти проблему. Во-первых, ошибка C2059 связана с тем, что функция max
переопределяется, я уверен в этом, потому что именно так я ее исправил. Тогда функция round
не имеет прототипа. Хм, это странно. Ну, это потому, что round
не в math.h
, поэтому вам нужно реализовать один как в верхней части вашего файла, например:
int round(double number)
{
return (number >= 0) ? (int)(number + 0.5) : (int)(number - 0.5);
}
Теперь он компилируется! В качестве подсказки вы также можете попробовать mex -v -g
при сборке, чтобы получить больше подробных отладочных сообщений. Надеюсь, это поможет вам!
Вот последнее из того, что у меня здесь есть:
- Повторная загрузка voc-release4.01.tgz
- Извлечение и переименование всех
.cc
файлов .cpp
файлов.
Откройте скрипт compile.m
и измените его так:
mex -v -g resize.cpp
mex -v -g dt.cpp
mex -v -g features.cpp
mex -v -g getdetections.cpp
% используют одно из следующих в зависимости от ваших настроек
% 0 самый быстрый, 3 самый медленный
% 0) многопоточная свертка с использованием SSE
% mex -v -g fconvsse.cpp -o fconv
% 1) многопоточная свертка с использованием бласта
% ПРЕДУПРЕЖДЕНИЕ: версия blas не работает с matlab> = 2010b
% и процессоры Intel
% mex -O fconvblasMT.cpp -lmwblas -o fconv
% 2) многопоточная свертка без бластов
% mex -O fconvMT.cpp -o fconv
% 3) свертка с использованием бласт
mex -g -v fconvblas.cpp -LC: \ MATLAB \ R2009bSP1 \ extern \ lib \ win32 \ microsoft -lmwblas -output fconv
% 4) базовая свертка, очень совместимая
% mex -O fconv.cpp -o fconv
Я рекомендую остановиться на варианте 3, pthreads, вероятно, слишком много для вас на данный момент. : -)
- resize.cpp
Добавить
#define bzero (b, len) (memset ((b), '\ 0', (len)), (void) 0)
int round (двойное число)
{
возврат (число> = 0)? (int) (число + 0,5): (int) (число - 0,5);
}
вверху и измените:
alphainfo ofs[len];
до
alphainfo * ofs = (alphainfo *)mxMalloc(len);
и
assert(sy-1 >= 0);
в
подтвердить (sy1> = 0);
не забудьте mxFree(ofs);
в конце функции.
- dt.cpp: изменить все
int32_t
на int32_T
.
features.cpp
Добавить
int round (двойное число)
{
возврат (число> = 0)? (int) (число + 0,5): (int) (число - 0,5);
}
- Убедитесь, что у вас есть каталог
C:\MATLAB\R2009bSP1\extern\lib\win32\microsoft
, если нет, поместите туда каталог библиотеки extern релиза Matlab.
Наслаждайтесь.