Я пытаюсь понять некоторые ошибки, возникающие при компиляции функции MATLAB, написанной на C (в Mac OS X). Функция msound предоставлена моим университетом в ОС Windows и Linux и является основой для некоторых дополнительных функций, связанных с записью и воспроизведением звука. Поскольку я Mac-User, я думал, что было бы довольно аккуратно скомпилировать его в Mac-версию.MATLAB: Отсутствующие рамки для mex-компиляции - Неопределенные символы для архитектуры x86_64
Из исходного кода и его функции-компилятора для Linux я попытался перепроектировать Mac-версию команд-компиляторов, но я продолжаю получать ошибки, приводящие к сбою компиляции. Вот то, что я ставлю вместе, как компилятор-функции до сих пор:
function compile_msound_unix
disp('Building msound ...')
szOptions = '';
szDefines = '';
szPaths = '';
szFiles = '';
szLibs = '';
szOptions = sprintf('%s %s', szOptions, '-output msound' );
szOptions = sprintf('%s %s', szOptions, '-largeArrayDims' );
% Add main file.
szFiles = addFile(szFiles, 'msound.c');
% Add basic PortAudio include paths and files.
szPaths = addPath(szPaths, 'portaudio/include' );
szPaths = addPath(szPaths, 'portaudio/src/common' );
szPaths = addPath(szPaths, 'portaudio/src/os/unix' );
szFiles = addFile(szFiles, 'portaudio/src/common/pa_allocation.c' );
szFiles = addFile(szFiles, 'portaudio/src/common/pa_converters.c' );
szFiles = addFile(szFiles, 'portaudio/src/common/pa_cpuload.c' );
szFiles = addFile(szFiles, 'portaudio/src/common/pa_debugprint.c' );
szFiles = addFile(szFiles, 'portaudio/src/common/pa_dither.c' );
szFiles = addFile(szFiles, 'portaudio/src/common/pa_front.c' );
szFiles = addFile(szFiles, 'portaudio/src/common/pa_process.c' );
szFiles = addFile(szFiles, 'portaudio/src/common/pa_ringbuffer.c' );
szFiles = addFile(szFiles, 'portaudio/src/common/pa_skeleton.c' );
szFiles = addFile(szFiles, 'portaudio/src/common/pa_stream.c' );
szFiles = addFile(szFiles, 'portaudio/src/common/pa_trace.c' );
% Host
szFiles = addFile(szFiles, 'portaudio/src/os/unix/pa_unix_hostapis.c' );
szFiles = addFile(szFiles, 'portaudio/src/os/unix/pa_unix_util.c' );
% Add PortAudio path for: Apple Core Audio API
disp(' Using ''Apple Core Audio API'' ...')
% Defines
szDefines = addDefine(szDefines, 'PA_USE_COREAUDIO');
szDefines = addDefine(szDefines, '__MACOSX_CORE__');
% PortAudio
szPaths = addPath(szPaths, 'portaudio/src/hostapi/coreaudio');
szFiles = addFile(szFiles, 'portaudio/src/hostapi/coreaudio/pa_mac_core_blocking.c');
szFiles = addFile(szFiles, 'portaudio/src/hostapi/coreaudio/pa_mac_core_utilities.c');
szFiles = addFile(szFiles, 'portaudio/src/hostapi/coreaudio/pa_mac_core.c');
% Libs
% szLibs = addLib (szLibs , '/full/path/to/library?');
% Build msound MEX-file using default compiler.
eval([ 'mex', szOptions, szDefines, szPaths, szFiles, szLibs ]);
function szCmd = addFile (szCmd, szFile)
szCmd = sprintf('%s "%s"' , szCmd, szFile);
function szCmd = addPath (szCmd, szPath)
szCmd = sprintf('%s "-I%s"', szCmd, szPath);
function szCmd = addDefine(szCmd, szName)
szCmd = sprintf('%s "-D%s"', szCmd, szName);
function szCmd = addLib (szCmd, szLib )
szCmd = sprintf('%s "-l%s"', szCmd, szLib );
function szCmd = addLibPath(szCmd, szPath)
szCmd = sprintf('%s "-L%s"', szCmd, szPath)
я уже устранены некоторые другие ошибки, но сейчас я застрял со следующей MATLAB консоли вывода:
Building msound ...
Using 'Apple Core Audio API' ...
msound.c: In function 'msoundDeviceInfo':
msound.c:3042: warning: initialization makes pointer from integer without a cast
msound.c:3044: warning: initialization makes pointer from integer without a cast
msound.c:3046: warning: initialization makes pointer from integer without a cast
msound.c:3048: warning: initialization makes pointer from integer without a cast
portaudio/src/hostapi/coreaudio/pa_mac_core.c: In function 'AudioIOProc':
portaudio/src/hostapi/coreaudio/pa_mac_core.c:1911: warning: 'AudioConverterFillBuffer' is deprecated (declared at /Developer/SDKs/MacOSX10.6.sdk/System/Library/Frameworks/AudioToolbox.framework/Headers/AudioConverter.h:641)
portaudio/src/hostapi/coreaudio/pa_mac_core.c:2080: warning: 'AudioConverterFillBuffer' is deprecated (declared at /Developer/SDKs/MacOSX10.6.sdk/System/Library/Frameworks/AudioToolbox.framework/Headers/AudioConverter.h:641)
Undefined symbols for architecture x86_64:
"_mxCreateScalarDouble", referenced from:
_msoundDeviceInfo in msound.o
"_AudioDeviceSetProperty", referenced from:
_setBestFramesPerBuffer in pa_mac_core_utilities.o
_AudioDeviceSetPropertyNowAndWaitForChange in pa_mac_core_utilities.o
(maybe you meant: _AudioDeviceSetPropertyNowAndWaitForChange)
"_AudioDeviceGetProperty", referenced from:
_setBestFramesPerBuffer in pa_mac_core_utilities.o
_AudioDeviceSetPropertyNowAndWaitForChange in pa_mac_core_utilities.o
_setBestSampleRateForDevice in pa_mac_core_utilities.o
_GetChannelInfo in pa_mac_core.o
_PaMacCore_Initialize in pa_mac_core.o
_OpenStream in pa_mac_core.o
_PaMacCore_GetChannelName in pa_mac_core.o
...
"_AudioDeviceGetPropertyInfo", referenced from:
_setBestFramesPerBuffer in pa_mac_core_utilities.o
_setBestSampleRateForDevice in pa_mac_core_utilities.o
_GetChannelInfo in pa_mac_core.o
_PaMacCore_Initialize in pa_mac_core.o
_PaMacCore_GetChannelName in pa_mac_core.o
"_AudioDeviceAddPropertyListener", referenced from:
_AudioDeviceSetPropertyNowAndWaitForChange in pa_mac_core_utilities.o
_OpenAndSetupOneAudioUnit in pa_mac_core.o
"_AudioDeviceRemovePropertyListener", referenced from:
_AudioDeviceSetPropertyNowAndWaitForChange in pa_mac_core_utilities.o
_CloseStream in pa_mac_core.o
"_AudioHardwareGetPropertyInfo", referenced from:
_PaMacCore_Initialize in pa_mac_core.o
"_AudioHardwareGetProperty", referenced from:
_PaMacCore_Initialize in pa_mac_core.o
"_AudioUnitUninitialize", referenced from:
_CloseStream in pa_mac_core.o
"_CloseComponent", referenced from:
_CloseStream in pa_mac_core.o
_OpenAndSetupOneAudioUnit in pa_mac_core.o
"_AudioConverterDispose", referenced from:
_CloseStream in pa_mac_core.o
"_AudioConverterReset", referenced from:
_StartStream in pa_mac_core.o
"_AudioOutputUnitStart", referenced from:
_StartStream in pa_mac_core.o
"_AudioOutputUnitStop", referenced from:
_StopStream in pa_mac_core.o
_AudioIOProc in pa_mac_core.o
"_AudioUnitGetProperty", referenced from:
_StopStream in pa_mac_core.o
_startStopCallback in pa_mac_core.o
_OpenAndSetupOneAudioUnit in pa_mac_core.o
"_AudioUnitReset", referenced from:
_StopStream in pa_mac_core.o
"_AudioDeviceGetCurrentTime", referenced from:
_GetStreamTime in pa_mac_core.o
_AudioIOProc in pa_mac_core.o
"_FindNextComponent", referenced from:
_OpenAndSetupOneAudioUnit in pa_mac_core.o
"_OpenAComponent", referenced from:
_OpenAndSetupOneAudioUnit in pa_mac_core.o
"_AudioUnitSetProperty", referenced from:
_OpenAndSetupOneAudioUnit in pa_mac_core.o
"_AudioUnitAddPropertyListener", referenced from:
_OpenAndSetupOneAudioUnit in pa_mac_core.o
"_AudioConverterNew", referenced from:
_OpenAndSetupOneAudioUnit in pa_mac_core.o
"_AudioConverterSetProperty", referenced from:
_OpenAndSetupOneAudioUnit in pa_mac_core.o
"_AudioUnitInitialize", referenced from:
_OpenAndSetupOneAudioUnit in pa_mac_core.o
"_AudioUnitRender", referenced from:
_AudioIOProc in pa_mac_core.o
"_AudioConverterFillBuffer", referenced from:
_AudioIOProc in pa_mac_core.o
"_CFStringCreateWithFormat", referenced from:
_PaMacCore_GetChannelName in pa_mac_core.o
"_CFStringGetLength", referenced from:
_PaMacCore_GetChannelName in pa_mac_core.o
"_CFStringGetCString", referenced from:
_PaMacCore_GetChannelName in pa_mac_core.o
"_CFRelease", referenced from:
_PaMacCore_GetChannelName in pa_mac_core.o
"___CFConstantStringClassReference", referenced from:
CFString in pa_mac_core.o
ld: symbol(s) not found for architecture x86_64
collect2: ld returned 1 exit status
mex: link of ' "msound.mexmaci64"' failed.
??? Error using ==> mex at 208
Unable to complete successfully.
Error in ==> compile_msound_unix at 51
eval([ 'mex', szOptions, szDefines, szPaths, szFiles, szLibs ]);
Основная проблема заключается в том, что Undefined symbols for architecture x86_64
. Я сделал некоторые исследования по этому вопросу, теперь я знаю, что некоторые рамки могут отсутствовать. Но я очень новичок в такого рода программировании (и компиляции на Mac), и я мог бы использовать некоторую помощь.
Функция, которую я пытаюсь скомпилировать, основана на аудио-вводе/выводе PortAudio, который поддерживает CoreAudio на Mac. Как вы видите в моей компилятор-функции, я уже включил файлы PortAudio, которые необходимы, но я все еще не хватает соответствующих библиотек/фреймворков. Я уже пытался предоставить им такие строки, как:
szLibs = addLib (szLibs , '/System/Library/Frameworks/CoreAudio.framework');
но безуспешно. Я очень надеюсь, что у вас есть идеи, как это сделать. Я использую Mac OS X 10.7.3 Lion, и у меня установлен Xcode и работает gcc-4.2. MATLAB версии 2011a (v7.12)
Спасибо заранее,
января
Так что я продолжал работать над вопросами и установил предупреждения на линии 3042, 3044, 3046 и 3048: Они были созданы 'mxCreateScalarDouble' заменяется функцией mxCreateDoubleScalar в MATLAB 6.5 и уже удаляется в моей версии. Таким образом, это исчезло вместе с первым из недостающих символов, что было вызвано вышеупомянутой заменой 'mxCreateDoubleScalar'. –