在Windows上编译Felzenszwalb VOC时出现Matlab Mex32链接错误

我正在用Matlab编译一个C文件( voc-release库的一部分),我收到下面的错误。 我似乎无法解决它。 谁能告诉我是什么原因导致这个错误以及我能做些什么呢?


     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'的链接失败。


如果您包含了更多错误消息,我相信这已经得到了回答,只是一个FYI。 看起来你正在从一些非matlab源代码编译一个文件,这很好,但是你可能需要提供更多关于它的信息。 似乎features.cc文件引用了一个符号round ,这就是你得到错误的原因。 您需要为函数提供库,或者从源代码编译它。 如果您执行help mex ,它应该能够为您提供有关库链接器命令的信息-L用于路径, -l用于库。 我似乎记得这个function并不像宣传的那样完全正常,并且要求你使用-lC:/path/to/library/libfile.lib ,或者其他什么。 首先,我建议从Matlab帮助中编译yprime示例。 这将确保您正确设置编译器,这听起来有可能。 另外,看看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的multithreading卷积

    %1)使用blas%的multithreading卷积警告:blas版本不适用于matlab> = 2010b%和Intel CPUs%mex -O fconvblasMT.cpp -lmwblas -o fconv

    %2)没有blas的mulththaded卷积%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); 在function的最后。

  1. dt.cpp:将所有int32_t更改为int32_T
  2. features.cpp添加

    int round(double number){return(number> = 0)? (int)(数字+ 0.5):( int)(数字 – 0.5); }

  3. 确保你有一个目录C:\MATLAB\R2009bSP1\extern\lib\win32\microsoft ,如果没有把你的Matlab发布extern库目录放在那里。

请享用。