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

时间:2012-03-07 13:33:02

标签: c matlab mex

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


    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 个答案:

答案 0 :(得分:2)

如果您包含了更多错误消息,我相信这会有 已经回答,只是一个FYI。看起来你正在编译一个文件 从一些非matlab源码,这很好,但你可能会不得不这样做 提供更多相关信息。似乎features.cc文件是 引用符号round,这就是您收到错误的原因。你需要 为函数提供库,或从源代码编译它。如果你这样做 一个help mex,它应该能够为您提供有关库链接器的信息 命令-L用于路径,-l用于库。我似乎记得那个 此功能与广告完全不同,需要您使用 -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中,所以您需要像文件顶部那样implement one,如下所示:

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 CPU %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

  4. 我建议保留选项3,此时pthreads对你来说可能有点太多了。 : - )

    1. resize.cpp
    2. 添加     #define bzero(b,len)(memset((b),'\ 0',(len)),(void)0)     int round(双号)     {       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,如果没有将您的Matlab发布外部库目录放在那里。
      4. 享受。