2012-03-07 4 views
1

MatlabでCファイル(voc-releaseライブラリの一部)をコンパイルしていますが、以下のエラーが表示されます。 私はそれを解決していないようです。誰もがこのエラーの原因と私がそれについて何ができるのか教えていただけますか?エラーメッセージの多くを含めた場合WindowsでFelzenszwalb VOCをコンパイル中にMatlab Mex32リンクエラーが発生しました

 

    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

どのmexコンパイラを使用していますか? 'mex -setup'を参照してください。 – Nzbuu

+0

私はこの命令で2つのコンパイラを試しました。 "mex -setup" matlabに含まれているものとVisual C++ 最初のファイルはいくつかのファイルで実行されますが、2番目のファイルはこれらのファイル、.hファイル致命的なエラー – SafeY

答えて

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関数にプロトタイプはありません。うーん、それは奇妙です。

int round(double number) 
{ 
    return (number >= 0) ? (int)(number + 0.5) : (int)(number - 0.5); 
} 

今ではコンパイル:roundはそうあなたがそうのようなあなたのファイルの先頭に似implement oneする必要がありますmath.hではないのでまあ、それはです!ヒントとして、より詳細なデバッグメッセージを得るためにビルドするときにmex -v -gを試すこともできます。これがあなたの道に迷惑をかけないように!

は、ここで私がここに持っているものの最後です:

  1. 再ダウンロードVOC-release4.01.tgz
  2. エキスとは、すべての.ccファイルに.cppファイルの名前を変更します。
  3. オープンcompile.mスクリプトなどのように変更します。

    MEX -v -g resize.cpp MEX -v -g dt.cpp MEX -v -g機能。CPP MEX -v -g getdetections.cpp

    %使用 %0が最速で、あなたの設定に応じて、次のいずれか、3は最も遅いです

    % 0)マルチスレッドのコンボリューションSSE %のMEXは-v使用して - グラムfconvsse.cpp -o FCONV

    % 1)マルチスレッドのコンボリューションBLAS %警告使用:BLASバージョンMathWorks社のMATLABでは動作しません> = 2010B %とIntelのCPUの %MEX -O fconvblasMT.cpp -lmwblas -oをfconv

    LIB \ \ MATLAB \ R2009bSP1 \のEXTERN:

    % 2)BLAS MEX -g -v fconvblas.cpp -LCを用いBLAS %MEX -O fconvMT.cpp -o FCONV

    % 3)畳み込みなし畳み込みをmulththreaded \ FCONV

    % 4)基本的なコンボリューション、非常に互換性 %-outputマイクロソフト-lmwblas \ win32のは、MEX -O fconv.cpp -o FCONV私はオプション3での滞在をお勧めします

は、pthreadsのはただそうですこの時点であなたにはあまりにも多くのことがあります。 :-)

  1. resize.cpp

は の#define BZERO追加(bは、LEN)(memsetの((b)は、 '\ 0'、(LEN))、(無効)0) int round(double number) { return(number> = 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_tint32_Tに変更してください。
  2. features.cpp

    int型のラウンド(ダブルナンバー) { リターン(数> = 0)を追加しますか? (int)(number + 0.5):(int)(number - 0.5); }

  3. ディレクトリC:\MATLAB\R2009bSP1\extern\lib\win32\microsoftがあることを確認してください。そこにMatlabリリースexternライブラリディレクトリを置いていなければなりません。

お楽しみください。

+0

私は他のファイルc&ccを試しましたが、正しくコンパイルされます。 しかし、features.ccのようなものは、私にそのエラーを与えています。 私はそれらをすべて持ってきて、それらを "インクルードディレクトリ"に入れます エラーはヘッダーファイル自体にあるようになりました! それは私を狂って運転している、私は解決策を見つけることができません! ネット上のいくつかのページには、Windowsエラーがあると記載されています。S あなたの返信をすべて理解できませんでした:$ – SafeY

+0

@PureSoul features.ccファイルの投稿を検討しますか? – macduff

+0

確かに、わかりませんここに投稿することが許可されている場合:$ – SafeY

関連する問題