我正在使用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.
答案 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
以获取更详细的调试消息。希望这能让你顺利上路!
这是我在这里的最后一个:
.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
%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对你来说可能有点太多了。 : - )
添加 #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);
。
int32_t
更改为int32_T
。features.cpp 添加
int round(双号) { return(number> = 0)? (int)(数字+ 0.5):( int)(数字 - 0.5); }
C:\MATLAB\R2009bSP1\extern\lib\win32\microsoft
,如果没有将您的Matlab发布外部库目录放在那里。享受。