2011-03-24 2 views
6

mex 파일에서 FFTW 코드를 실행하려고합니다. 이는 개발 및 테스트 목적으로 만 사용됩니다. 일부 인터넷 검색 결과, 다른 사람들이 비슷한 일을 시도하고 관련 문제가 있음을 알았지 만 해결책을 찾지 못했습니다. mex 파일을 실행할 때, Matlab은 나를 알려줍니다 :FFTW를 Matlab Mex 파일에 연결

??? 오류 사용 ==> chirpTransform.mxCta 잘못된 MEX 파일 '\ removed \ my \ directory \ + chirpTransform \ mxCta.mexw32': 지정된 절차를 찾을 수 없습니다.

.

LCC에 문제가있는 것 같아서 MinGW에서 gnumex를 사용하여 mex 파일을 작성하고 있습니다. 나는 FFTW 사이트 (http://www.fftw.org/install/windows.html)에서 32 비트 DLL을 사용해 보았습니다. 나는 Matlab 2009b bin 디렉토리에서 fftwf3.dll을 사용하여 시도했다. Mysys/MinGW를 사용하여 소스에서 DLL을 만들었습니다. 모든 경우에 결과는 동일합니다. 모든 경우에 lib 파일을 생성하기 위해 다음을 수행했습니다.

as.exe \는 MinGW \ BIN \

는 C : libfftw3f.lib --as C -l \ gnumex \ mexdlltool.exe -d libfftw3f-3.def libfftw3f -D-3.dll

나는 또한 visual studio lib.exe 도구를 사용해 보았고 다양한 mexdlltool 플래그로 실험했습니다.

Matlab의 loadlibrary 기능을 사용하여 fftwf3-3.dll의 함수를 직접 호출 할 수있는 것처럼 보입니다. DLL이 문제가 아니기 때문에 정적 인 fftwf3 버전을 만들고 mex 파일에 직접 연결하려고했습니다. 나는 같은 결과를 얻었다! FFTW 코드를 제거하면 mex 파일이 올바르게 실행됩니다. 나는이 시점에서 포기했다. 나는 대안 테스트 방법을 생각해 내야 만한다.

+1

"LCC에는 몇 가지 문제가있는 것 같습니다."- 정확히 무엇을 의미합니까? –

+0

MEX 코드를 게시 할 수 있습니까 (관련 부분 이상)? – Amro

+9

Matlab은 실제로 FFT를 내부적으로 FFTW를 사용합니다. 귀하의 FFTW 버전이 Matlab이 사용하는 버전과 충돌하지 않거나 Matlab FFTW 라이브러리에 링크되어 있지 않은지 확인하십시오. – sfstewman

답변

1

다른 mex 기능으로이 문제가 발생했습니다. 내 경험상, 일반적으로 의존성 문제가 있음을 의미합니다. 일부 종속성이 없습니다. Invalid MEX-File Error

은 그것을 읽기를 지정하고 문제를 진단 종속성 워커를 사용해보십시오 : 여기

이 문제에 TMW의 문서에 대한 링크입니다.

0

오랜 시간이 걸렸으며 설정이 변경되었지만 지금은 저에게 효과적입니다. 나는 hoogamaphone이 옳다고 생각합니다. 아마도 mex dll과 같은 디렉토리에 fftw dll이 없었을 것입니다 (그리고 그것은 내 경로에 없었습니다). 사실, 64 비트 Matlab 2016a는 여전히 실종 된 종속성이있을 때 mex 파일을 찾을 수 없다는 경고를줍니다.

현재 설치 프로그램은 기본적으로 Visual Studio 2013 C++ 컴파일러를 사용하고 있습니다. fftw 웹 사이트에서 언급했듯이 링크 용 lib 파일을 생성해야합니다. 당신과 같이 일반 명령 프롬프트에서 Visual Studio 명령 프롬프트를 실행할 수 있습니다

"%VS120COMNTOOLS%VsDevCmd.bat" 

그런 다음 DEF 파일과 디렉토리에서 다음을 실행합니다.

lib /machine:x64 /def:libfftw3f-3.def 

그리고 컴파일하십시오.

mex mxCta.c cta.c -I../fftw -L../fftw -llibfftw3f-3.lib 

아마도 다른 가능성은 gnumex가 mex.dll에 대한 의존성을 도입했기 때문일 수 있습니다. 더 이상 gnumex를 사용하여 다른 코드를 성공적으로 테스트했는지 여부를 기억하지 않습니다. cygwin을 사용할 때 mingw 컴파일러 (x86_64-w64-mingw32-gcc)를 사용하지 않으면 cygwin1.dll에 의존하게됩니다.

마지막으로, 둘 이상의 컴파일러를 사용하는 경우 모든 컴파일러 플래그가 동일해야합니다 (동일한 함수 호출 규칙, ABI 등). 또한 Mathworks는 mex 빌드 절차를 변경했습니다. 최근 프로젝트에서, 나는

C에서 내 로컬 디렉토리에 mexconfig.xml 복사 : 사용자 \ \ 참고 MyUser \의 AppData과 같이 \ 로밍 \ 매스 웍스 \ MATLAB \ R2016a \ mex_C_win64.xml

하고 편집 컴파일러 플래그 :

COMPFLAGS="/Zp8 /GR /W3 /EHs /nologo /MD /Gz /TC" 

사용자 정의 빌드 파일을 사용하는 경우 -f 옵션을 사용하십시오.

mex mxCustom.c custom.lib -f mexconfig.xml