在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
来获取更详细的调试消息。 希望这能让你顺利上路!
这是我在这里得到的最后一件事:
- 重新下载voc-release4.01.tgz
- 提取并重命名所有
.cc
文件.cpp
文件。 -
打开
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对你来说可能有点太多了。 🙂
- 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的最后。
- dt.cpp:将所有
int32_t
更改为int32_T
。 -
features.cpp添加
int round(double number){return(number> = 0)? (int)(数字+ 0.5):( int)(数字 – 0.5); }
- 确保你有一个目录
C:\MATLAB\R2009bSP1\extern\lib\win32\microsoft
,如果没有把你的Matlab发布extern库目录放在那里。
请享用。