gpt4 book ai didi

c - 在 Windows 上编译 Felzenszwalb VOC 时出现 Matlab Mex32 链接错误

转载 作者:太空宇宙 更新时间:2023-11-04 03:02:37 28 4
gpt4 key购买 nike

我正在用 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”链接失败。

最佳答案

如果您包含更多错误消息,我相信这会
已经回答了,仅供引用。看起来你正在编译一个文件
来自一些非matlab来源,这很好,但你可能不得不
提供有关它的更多信息。看来 features.cc 文件是
引用符号 round这就是您收到错误的原因。你需要
为函数提供库,或从源代码编译它。如果你这样做
一个 help mex ,它应该能够为您提供有关库链接器的信息
命令 -L对于路径和 -l为图书馆。我好像记得
此功能与宣传的不完全一样,需要您使用-lC:/path/to/library/libfile.lib , 管他呢。首先,我会推荐
编译yprime Matlab 帮助中的示例。这将确保您
正确设置编译器,这听起来很可能。另外,采取一个
查看 yprime.c 文件和 mexFunction .您可能需要确保
编译器将接受 .cc文件作为 C 文件。它可能将其解释为 C++
文件,这会让您更加头疼。您可以重命名 yprime.c文件
yprime.cc只是为了测试这个想法。

编辑
感谢您提供代码。这应该是蛋糕,我的 friend ,完整的蛋糕。 :-)

这是我尝试使用编译时遇到的错误:

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函数没有原型(prototype)。嗯,这很奇怪。嗯,那是因为 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 对您来说可能有点太多了。 :-)
  • 调整大小.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_tint32_T .
  • 特征.cpp
    添加

    int round(双数)
    {
    返回(数字> = 0)? (int)(number + 0.5) : (int)(number - 0.5);
    }
  • 确保您有一个目录 C:\MATLAB\R2009bSP1\extern\lib\win32\microsoft ,如果没有把你的 Matlab 版本的外部库目录放在那里。

  • 享受。

    关于c - 在 Windows 上编译 Felzenszwalb VOC 时出现 Matlab Mex32 链接错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9602464/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com