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.
如果包含了更多的错误信息,我认为,这将有 已经有了答案,只是一个供参考。它看起来像你从一些非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
函数没有原型。嗯,这很奇怪。嗯,这是因为round
不math.h
所以你需要implement one喜欢你的文件的顶部像这样:
int round(double number)
{
return (number >= 0) ? (int)(number + 0.5) : (int)(number - 0.5);
}
现在它编译!作为提示,您还可以在构建时尝试mex -v -g
以获取更详细的调试消息。希望这会让你顺其自然!
这里是最后的,我在这里得到了什么:
- 重新下载VOC-release4.01.tgz
- 提取和重新命名所有
.cc
文件.cpp
文件。 -
打开
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停留,并行线程很可能只是在这个时候对你来说有点太过分了。 :-)
- 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);
。
- dt.cpp:将所有
int32_t
更改为int32_T
。 -
features.cpp 添加
INT轮(双号) { 返回(数> = 0)? (int)(number + 0.5):(int)(number - 0.5); }
- 确保你有一个目录
C:\MATLAB\R2009bSP1\extern\lib\win32\microsoft
,如果没有把你的Matlab发布extern库目录放在那里。
享受。
你使用的是什么mex编译器?请参阅'mex -setup'。 – Nzbuu 2012-03-07 14:11:01
我试过两个编译器,通过这个指令“mex -setup” 包含在matlab中的一个和visual C++ 第一个在某些文件上运行,但第二个不在这些文件上运行.h文件致命错误 – SafeY 2012-03-07 18:25:47