Ошибка ссылки Matlab Mex32 при компиляции Felzenszwalb VOC в Windows - PullRequest
1 голос
/ 07 марта 2012

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


    mex -O features.cc
    Writing library for features.mexw32 
    c:\users\safaa\appdata\local\temp\mex_ty~1\features.obj .text: undefined reference to '_round' 
    C:\PROGRA~1\MATLAB\R2009A\BIN\MEX.PL: Error: Link of 'features.mexw32' failed.


1 Ответ

2 голосов
/ 08 марта 2012

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

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

  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 не работает с 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, вероятно, слишком много для вас на данный момент. : -)

  1. 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); в конце функции.

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

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

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

Наслаждайтесь.

...