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

问题描述:

我正在用Matlab编译C文件(voc-release库的一部分),我得到下面的错误。 我似乎无法解决它。谁能告诉我是什么原因导致了这个错误,我能做些什么呢?Matlab在编译Windows上的Felzenszwalb VOC时出现Mex32链接错误

 

    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. 


+0

你使用的是什么mex编译器?请参阅'mex -setup'。 – Nzbuu 2012-03-07 14:11:01

+0

我试过两个编译器,通过这个指令“mex -setup” 包含在matlab中的一个和visual C++ 第一个在某些文件上运行,但第二个不在这些文件上运行.h文件致命错误 – SafeY 2012-03-07 18:25:47

如果包含了更多的错误信息,我认为,这将有 已经有了答案,只是一个供参考。它看起来像你从一些非matlab源文件编译 ,这很好,但你可能需要 提供更多关于它的信息。看起来features.cc文件是 引用一个符号round这就是为什么你会收到错误。您需要 来为函数提供库,或者从源代码编译它。如果您执行 a 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函数没有原型。嗯,这很奇怪。嗯,这是因为roundmath.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功能。CPP MEX -v -g getdetections.cpp

    %使用根据您的设置 %0是最快以下情况之一,3是最慢的

    %0)使用SSE %MEX -v多线程卷积 - 克fconvsse.cpp -o fconv

    %1)的多线程使用BLAS %警告卷积:所述BLAS版本不使用MATLAB> = 2010年b %和英特尔CPU工作 %MEX -O fconvblasMT.cpp -lmwblas -o fconv

    %2)无BLAS mulththreaded卷积 %MEX -O fconvMT.cpp -o fconv

    %3)卷积使用BLAS MEX -g -v fconvblas.cpp -LC:\ MATLAB \ R2009bSP1 \的extern \ lib中\ WIN32 \微软-lmwblas - 输出fconv

    %4)基本卷积,可兼容 %MEX -O fconv.cpp -o fconv

我建议使用选项3停留,并行线程很可能只是在这个时候对你来说有点太过分了。 :-)

  1. resize.cpp

添加 的#define bzero(B,LEN)(memset的((b)中, '\ 0',(LEN)),(无效)0) int round(double number) { return(number> = 0)? (int)(number + 0.5):(int)(number - 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轮(双号) { 返回(数> = 0)? (int)(number + 0.5):(int)(number - 0.5); }

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

享受。

+0

我试过其他文件c&cc,它们编译正确 但与其他像features.cc m它给我的错误,其余的说它有缺少头文件! 当我把它们全部放在“包含目录” 错误转变为在头文件本身! 这让我疯狂,我无法找到解决方案! 网上的一些网页说有一个windows错误:S 我无法理解你的所有回复:$ – SafeY 2012-03-08 13:13:00

+0

@PureSoul你会考虑发布你的features.cc文件吗? – macduff 2012-03-08 14:17:15

+0

当然,我不知道如果它被允许发布在这里:$ – SafeY 2012-03-08 17:11:23