【问题标题】:Matlab Mex32 link error while compiling Felzenszwalb VOC on Windows在 Windows 上编译 Felzenszwalb VOC 时出现 Matlab Mex32 链接错误
【发布时间】:2012-03-07 13:33:01
【问题描述】:

我正在使用 Matlab 编译一个 C 文件(voc-release 库的一部分),但出现以下错误。 我似乎无法解决它。谁能告诉我是什么导致了这个错误以及我能做些什么?

墨西哥 -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”链接失败。

【问题讨论】:

  • 您使用的是什么 mex 编译器?见mex -setup
  • 我已经通过这个指令“mex -setup”尝试了两个编译器,一个包含在matlab和visual c++中,第一个在某些文件上运行,但第二个不在那些文件上运行文件,.h 文件致命错误

标签: c matlab mex


【解决方案1】:

如果您包含更多错误消息,我相信这会 已经回答了,仅供参考。看起来你正在编译一个文件 来自一些非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 以获得更详细的调试消息。希望这能让您顺利上路!

这是我在这里得到的最后一个:

  1. 重新下载voc-release4.01.tgz
  2. 提取并重命名所有.cc 文件.cpp 文件。
  3. 打开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 对您来说可能有点太多了。 :-)

  1. 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);

  1. dt.cpp:将所有int32_t 更改为int32_T
  2. features.cpp 添加

    int round(双数) { 返回(数字> = 0)? (int)(number + 0.5) : (int)(number - 0.5); }

  3. 确保您有一个目录C:\MATLAB\R2009bSP1\extern\lib\win32\microsoft,如果没有,请将您的 Matlab 版本外部库目录放在那里。

享受吧。

【讨论】:

  • 我已经尝试过其他文件 c & cc 并且它们编译正确,但是对于其他文件,例如 features.cc m,它给了我这个错误,其余的它说缺少头文件!当我将它们全部带入“包含目录”时,错误变成了头文件本身!这让我发疯,我找不到解决方案!网上的一些页面说有一个Windows错误:S我无法理解你的所有回复:$
  • @PureSoul 你会考虑发布你的 features.cc 文件吗?
  • 可以,不知道能不能发在这里:$
  • 其实这不是我的代码,有一个叫“voc-release4.01”的工具 [link] cs.brown.edu/~pff/latent 和 features.cc 是其中的一个文件,c 文件中有一个可怕的错误!!!我把它们都修好了,但仍然存在这个链接问题和缺少的库,我只想让这个工具运行,我的工作中真的需要它:(
  • 正在编译!!!!!!!!! :D 非常感谢 macduff 先生,我现在将尝试编译其他文件 :)
猜你喜欢
  • 2015-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多