2012-03-07 3 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

나는 "mex -setup"명령을 통해 두 컴파일러를 시도했다. matlab에 포함 된 것과 Visual C++ 첫 번째 파일은 일부 파일에서 실행되지만 두 번째 파일은이 파일, .h 파일에서 실행되지 않는다. 치명적인 오류 – SafeY

답변

2

, 나는이 이미 그냥 참고로, 답을해야한다고 생각합니다. 당신이 파일을 컴파일하는 것 같습니다 일부 비 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 함수에는 프로토 타입이 없습니다. 흠, 이상 하네. roundmath.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 MEX -v -g dt.cpp MEX -v -g 기능을 제공합니다.CPP MEX -v -g getdetections.cpp

    퍼센트 사용 % 0 빠른 당신의 설정에 따라 다음 중 하나를 3 느린입니다

    퍼센트 0) 멀티 스레드 회선 SSE %의 MEX는 -v 사용 - BLAS에게 % 사용 경고 g fconvsse.cpp -o fconv

    퍼센트 1) 다중 스레드 컨벌루션 다음 BLAS 버전 MATLAB> = 2010b % 인텔 CPU가 작동하지 않는 % MEX -O fconvblasMT.cpp -lmwblas -o fconv

    ,210

    % 2) BLAS없이 mulththreaded 회선 %의 MEX가 -O fconvMT.cpp -o fconv

    % 3) 회선 사용 BLAS MEX -g -v fconvblas.cpp -LC : \ MATLAB \ R2009bSP1 \의 통근자의 \ lib 디렉토리 \ fconv

    % 4) 기본 회선, 매우 호환 % - 출력 마이크로 소프트 -lmwblas \는 Win32는 MEX -O fconv.cpp -o fconv 내가 옵션 3와 함께 머물 것을 권장합니다

은의 pthreads는 것 같다 이 시점에서 당신에게 조금 너무 많이. :-)

  1. resize.cpp

는 #DEFINE bzero 추가의 (b를 렌) (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 m 같은 다른 사람들과 나는 그 오류를주는거야 그리고 나머지 그것은 헤더 파일이 누락되었습니다 말합 !! 내가 그들을 가져 와서 "include 디렉토리"에 넣을 때 헤더 파일 자체에 오류가 있습니다! 그것은 나를 미치게합니다. 나는 해결책을 찾을 수 없습니다! 그물에 몇몇 페이지는 창문 오류가 있다고 말합니다 : S 답장을 모두 이해할 수 없었습니다 : $ – SafeY

+0

@ PureSoul features.cc 파일을 올리시겠습니까? – macduff

+0

확실히, 나도 몰라 여기에 게시 할 수 있다면 : $ – SafeY

관련 문제