如果您包含更多错误消息,我相信这会
已经回答了,仅供参考。看起来你正在编译一个文件
来自一些非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 以获得更详细的调试消息。希望这能让您顺利上路!
这是我在这里得到的最后一个:
- 重新下载voc-release4.01.tgz
- 提取并重命名所有
.cc 文件.cpp 文件。
-
打开compile.m脚本,修改如下:
mex -v -g resize.cpp
墨西哥 -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
我建议保留选项 3,此时 pthreads 对您来说可能有点太多了。 :-)
- resize.cpp
添加
#define bzero(b,len) (memset((b), '\0', (len)), (void) 0)
int round(双数)
{
返回(数字> = 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 round(双数)
{
返回(数字> = 0)? (int)(number + 0.5) : (int)(number - 0.5);
}
- 确保您有一个目录
C:\MATLAB\R2009bSP1\extern\lib\win32\microsoft,如果没有,请将您的 Matlab 版本外部库目录放在那里。
享受吧。