2011-03-24 37 views
6

Tôi đang cố gắng chạy mã FFTW trong tệp mex. Điều này là đúng với mục đích phát triển và thử nghiệm. Sau một số googling, tôi thấy rằng những người khác đã cố gắng để làm một cái gì đó tương tự và đã có vấn đề liên quan, nhưng tôi đã không tìm thấy bất kỳ giải pháp. Khi cố gắng chạy tệp mex, Matlab cho tôi biết:Liên kết FFTW với tệp Matlab Mex

??? Lỗi khi sử dụng ==> chirpTransform.mxCta Tệp MEX không hợp lệ '\ đã xóa \ my \ directory \ + chirpTransform \ mxCta.mexw32': Quy trình được chỉ định không thể là được tìm thấy.

.

Tôi đang sử dụng gnumex với MinGW để tạo tệp mex vì LCC có vẻ có một số vấn đề. Tôi đã thử bằng cách sử dụng 32 bit DLL từ trang web FFTW (http://www.fftw.org/install/windows.html). Tôi đã thử bằng cách sử dụng fftwf3.dll trong thư mục bin Matlab 2009b. Tôi đã xây dựng dll từ nguồn sử dụng Msys/MinGW. Trong mọi trường hợp, kết quả đều giống nhau. Trong mọi trường hợp, tôi đã làm như sau để tạo tệp lib.

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

Tôi cũng đã thử sử dụng công cụ visual studio lib.exe và thử nghiệm với nhiều cờ mexdlltool khác nhau.

Dường như tôi có thể gọi trực tiếp các chức năng trong fftwf3-3.dll bằng chức năng tải thư viện của Matlab. Kể từ khi DLL xuất hiện không phải là vấn đề, tôi đã cố gắng xây dựng một phiên bản tĩnh của fftwf3 và liên kết nó trực tiếp vào tập tin mex. Tôi đã nhận được kết quả tương tự! Nếu tôi loại bỏ mã FFTW, tập tin mex chạy tốt. Tôi vừa bỏ cuộc vào thời điểm này, và tôi buộc phải đưa ra các phương pháp thử nghiệm thay thế.

+1

"LCC có vẻ có một số vấn đề" - bạn có ý nghĩa gì? –

+0

bạn có thể đăng mã của MEX bạn đang sử dụng (các bộ phận liên quan ít nhất) không? – Amro

+9

Matlab thực sự sử dụng FFTW nội bộ cho FFT của nó. Đảm bảo rằng phiên bản FFTW của bạn không xung đột với phiên bản mà Matlab sử dụng hoặc liên kết với thư viện Matlab FFTW. – sfstewman

Trả lời

1

Tôi đã gặp sự cố này với các chức năng khác của mex. Theo kinh nghiệm của tôi, nó thường có nghĩa là có một vấn đề phụ thuộc. Một số phụ thuộc không được đặt.

Dưới đây là một liên kết đến tài liệu TMW về vấn đề này: Invalid MEX-File Error

Give it a đọc, và sau đó hãy thử sử dụng Dependency Walker để chẩn đoán vấn đề.

0

Đã lâu rồi thiết lập của tôi đã thay đổi, nhưng điều này có hiệu quả đối với tôi ngay bây giờ. Tôi nghi ngờ hoogamaphone đã đúng. Tôi có lẽ không có dll fftw trong cùng thư mục với dll mex (và nó không nằm trong đường dẫn của tôi). Trên thực tế, Matlab 2016a 64 bit vẫn cung cấp cho bạn một cảnh báo về việc không thể tìm thấy tệp mex khi, trên thực tế, đó là một sự phụ thuộc bị thiếu.

Thiết lập hiện tại của tôi đang sử dụng trình biên dịch Visual Studio 2013 C++ theo mặc định. Như đã đề cập trên trang web fftw, bạn cần tạo một tệp lib để liên kết. Bạn có thể chạy dấu nhắc lệnh Visual Studio từ dấu kiểm nhắc lệnh thông thường như sau:

"%VS120COMNTOOLS%VsDevCmd.bat" 

Sau đó chạy phần sau trong thư mục có tệp def.

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

Và biên dịch.

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

Có lẽ khả năng khác là gnumex giới thiệu một số phụ thuộc vào dll mex. Tôi không còn nhớ liệu tôi đã sử dụng gnumex thành công thử nghiệm mã khác hay chưa. Khi sử dụng Cygwin, nếu bạn không sử dụng trình biên dịch mingw (x86_64-w64-mingw32-gcc), bạn sẽ kết thúc với sự phụ thuộc vào cygwin1.dll.

Cuối cùng, nếu bạn sử dụng nhiều trình biên dịch, hãy đảm bảo tất cả các cờ của trình biên dịch giống nhau (cùng các quy ước gọi điện, ABI, v.v.). Ngoài ra, Mathworks đã thay đổi thủ tục xây dựng mex. Trong một dự án gần đây, tôi sao chép mexconfig.xml vào thư mục địa phương của tôi từ

C: \ Users \ myuser \ AppData \ Roaming \ MathWorks \ MATLAB \ R2016a \ mex_C_win64.xml

và thay đổi nội dung cờ biên dịch như vậy :

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

Nếu bạn sử dụng tệp xây dựng tùy chỉnh, hãy sử dụng tùy chọn -f.

mex mxCustom.c custom.lib -f mexconfig.xml 
Các vấn đề liên quan