OS X Lion, Matlab 2011a, Mex: неопределенные символы для архитектуры x86_64

Здравствуйте, пользователи Matlab / OS X,

Мне было интересно, можете ли вы мне еще раз помочь. У меня есть c-файл (st.c, частотно-временной анализ Стоквелла для MEG-данных) для Matlab, который я должен скомпилировать для своей системы (OS X Lion, Xcode 4.1.1). Это включает в себя

#include <fftw3.h>

Итак, я загрузил последнюю версию с http://www.fftw.org/ и скомпилировал ее. Все идет нормально. Но если я попытаюсь скомпилировать файл c

mex -st.c

Я получаю следующую ошибку:

-> gcc-4.2 -O -Wl,-twolevel_namespace -undefined error -arch x86_64 -Wl,-syslibroot,/Developer/SDKs/MacOSX10.6.sdk -mmacosx-version-min=10.5 -bundle -Wl,-exported_symbols_list,/Applications/MATLAB_R2011a.app/extern/lib/maci64/mexFunction.map -o  "st.mexmaci64"  st.o  -L/Applications/MATLAB_R2011a.app/bin/maci64 -lmx -lmex -lmat -lstdc++
Undefined symbols for architecture x86_64:
  "_fftw_destroy_plan", referenced from:
      _ist in st.o
      _st in st.o
  "_fftw_free", referenced from:
      _ist in st.o
      _st in st.o
  "_fftw_malloc", referenced from:
      _ist in st.o
      _st in st.o
  "_fftw_import_wisdom_from_file", referenced from:
      _ist in st.o
      _st in st.o
  "_fftw_plan_dft_1d", referenced from:
      _ist in st.o
      _st in st.o
  "_fftw_export_wisdom_to_file", referenced from:
      _ist in st.o
      _st in st.o
  "_fftw_execute", referenced from:
      _ist in st.o
      _st in st.o
  "_mexFunction", referenced from:
     -exported_symbol[s_list] command line option
ld: symbol(s) not found for architecture x86_64
collect2: ld returned 1 exit status

    mex: link of ' "st.mexmaci64"' failed.

(Я должен сказать, что компиляция c-файла из примера Matlab (yprime.c) работает без каких-либо проблем.) Пользуясь поиском в Google, я не нашел многого, но кто-то предложил следующее:

MATLAB необходимо связать 64-разрядную версию (x86_64). Вам нужно будет найти работающий 64-битный компилятор gfortran, библиотеки которого являются 64-битными и совместимы с ABI с gcc от Apple.

Здесь http://r.research.att.com/tools/ я нашел GNU Fortran 4.2 .4 для Mac OS X 10.7. Но это ничего не изменило, ошибка осталась прежней.

Я предполагаю, что архитектура скомпилирована неправильно, но я понятия не имею, как это изменить для Matlab / Xcode. Если это так, может ли кто-нибудь сказать мне, как это сделать?

Спасибо за вашу помощь


person Irreducible    schedule 06.09.2011    source источник
comment
Похоже, вы не скомпилировали FFTW для x86_64 или не связываются с вашей программой. Вы можете это проверить?   -  person    schedule 06.09.2011
comment
Я поместил fft3w.h и fft3w.f в matlabroot / extern / include. Если я возьму его оттуда, я получу следующее сообщение об ошибке: fftw3.h: No such file or directory. Я не очень знаком с mex и gcc, как лучше всего проверить, правильно ли он скомпилирован и связан?   -  person Irreducible    schedule 06.09.2011
comment
И я не знаком ни с FFTW, ни с Fortran, ни с MATLAB, хех. Тем не менее, похоже, что когда mex вызывает gcc, он не передает библиотеку FFTW - по крайней мере, я не могу определить это в этой gcc строке. Или, может быть, это так, но FFTW не скомпилирован для x86_64. Если у вас есть библиотека FFTW (возможно, с расширениями .o, .a или .dylib), запустите lipo -info для нее, и она сообщит вам архитектуры, для которых она была скомпилирована.   -  person    schedule 06.09.2011
comment
Я нашел libfftw3.a и кажется, что архитектура правильная или? Non-fat file: libfftw3.a is architecture: x86_64   -  person Irreducible    schedule 06.09.2011
comment
Здорово. Итак, насколько я могу судить, вам нужно выяснить, как сообщить mex, что он должен связать этот файл libfftw3.a, поскольку он не отображается в этой gcc строке. Он должен отображаться либо как есть, либо как -lfftw3.   -  person    schedule 06.09.2011
comment
@Irreducible: я думаю, вам нужно указать, где компилятор / компоновщик должен искать файлы заголовков и библиотеки: mex prog.c -I/path/include -L/path/lib/ -lfftw. Вы можете проверить документацию страницы для получения более подробной информации.   -  person Amro    schedule 07.09.2011


Ответы (1)


Вам нужно сделать ссылку на библиотеку fftw. Вы можете передавать флаги компоновщика напрямую команде mex. Так что вы, вероятно, захотите ввести такую ​​команду:

>> mex -v -I/path/to/fftw/include -L/path/to/fftw/lib/ -lfftw3 st.c

Параметр -v переведет mex в подробный режим и распечатает команды gcc, используемые для компиляции и связывания файла mex. Этот вывод полезен для отладки проблем связывания.

person codehippo    schedule 07.09.2011
comment
Теперь я получаю эту ошибку: gcc-4.2 -O -Wl,-twolevel_namespace -undefined error -arch x86_64 -Wl,-syslibroot,/Developer/SDKs/MacOSX10.6.sdk -mmacosx-version-min=10.5 -bundle -Wl,-exported_symbols_list,/Applications/MATLAB_R2011a.app/extern/lib/maci64/mexFunction.map -o "st.mexmaci64" st.o -L/usr/local/lib/ -lfftw3 -L/Applications/MATLAB_R2011a.app/bin/maci64 -lmx -lmex -lmat -lstdc++ Undefined symbols for architecture x86_64: "_mexFunction", referenced from: -exported_symbol[s_list] command line option ld: symbol(s) not found for architecture x86_64 - person Irreducible; 08.09.2011
comment
Я нашел здесь ссылку ответ, который позволил мне скомпилировать мой файл c: mex CFLAGS='-I/usr/local/lib' LDFLAGS='-t /usr/local/lib/libfftw3.a -lz -bundle' st.c -v - person Irreducible; 08.09.2011