Ошибка ссылки Matlab Mex32 при компиляции Felzenszwalb VOC в Windows

Я собираю файл C (часть библиотеки вокального релиза) с Matlab, и я получаю ошибку ниже. Я не могу решить это. Может кто-нибудь сказать мне, что вызывает эту ошибку и что я могу с этим сделать?

    mex -O features.cc
    Написание библиотеки для features.mexw32 
    c:\users\safaa\appdata\local\temp\mex_ty~1\features.obj .text: неопределенная ссылка на '_round' 
    C:\PROGRA~1\MATLAB\R2009A\BIN\MEX.PL: Ошибка: не удалось установить ссылку на файл features.mexw32.

1 ответ

Если бы вы включили больше сообщения об ошибке, я думаю, что на это уже ответили, просто к сведению. Похоже, что вы компилируете файл из какого-то не-matlab источника, что нормально, но вам, вероятно, придется предоставить больше информации об этом. Похоже, что файл 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 просто чтобы проверить идею.

РЕДАКТИРОВАТЬ Спасибо за предоставление кода. Это должен быть торт, мой друг, полный торт.:-)

Это моя ошибка, которую я получаю, когда пытаюсь скомпилировать, используя:

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 когда вы создаете, чтобы получить больше подробных сообщений отладки. Надеюсь, это поможет вам!

Вот последнее из того, что я получил здесь:

  1. Повторно загрузить voc-release4.01.tgz
  2. Извлечь и переименовать все .cc файлы .cpp файлы.
  3. Открой 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 % ПРЕДУПРЕЖДЕНИЕ: версия blas не работает с matlab >= 2010b % и процессорами Intel% mex -O fconvblasMT.cpp -lmwblas -o fconv

    % 2) многопоточная свертка без blas % mex -O fconvMT.cpp -o fconv

    % 3) свертка с использованием blas mex -g -v fconvblas.cpp -LC: \ MATLAB \ R2009bSP1 \ extern \ lib \ win32 \ microsoft -lmwblas -output fconv

    % 4) базовая свертка, очень совместимая% mex -O fconv.cpp -o fconv

Я рекомендую остановиться на варианте 3, pthreads, вероятно, слишком много для вас на данный момент.:-)

  1. resize.cpp

Добавить #define bzero(b,len) (memset((b), '\0', (len)), (void) 0) int round(double number) { return (number >= 0)? (int)(число + 0,5): (int)(число - 0,5); } вверху и измените:

alphainfo ofs[len];

в

alphainfo * ofs = (alphainfo *)mxMalloc(len);

а также

assert(sy-1 >= 0);

утверждать (sy1 >= 0); не забудь mxFree(ofs); в конце функции.

  1. dt.cpp: изменить все int32_t в int32_T,
  2. features.cpp Добавить

    int round (двойное число) {return (number> = 0)? (int) (число + 0,5): (int)(число - 0,5); }

  3. Убедитесь, что у вас есть каталог C:\MATLAB\R2009bSP1\extern\lib\win32\microsoft, если нет, поместите туда каталог библиотеки extern вашего релиза Matlab.

Наслаждаться.

Другие вопросы по тегам