2012-03-30 63 views
1

我一直在試圖讓我的頭周圍的一些錯誤,編譯C編寫的MATLAB功能(在Mac OS X),當我得到。函數msound由我的大學爲Windows和Linux預編譯,並且是有關錄製和播放音頻的其他功能的基礎。由於我是Mac用戶,我認爲將其編譯爲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上編譯),我可以使用一些幫助。

我嘗試編譯功能是基於支持在Mac上的CoreAudio的音頻PortAudio-I/O。正如你在我的編譯器函數中看到的,我已經包含了必要的PortAudio文件,但是我仍然缺少相應的庫/框架。我已經試圖爲他們提供如下線路:

szLibs = addLib (szLibs , '/System/Library/Frameworks/CoreAudio.framework'); 

但是沒有任何成功。我真的希望你們有想法如何讓這個運行。我正在使用Mac OS X 10.7.3 Lion,我安裝了Xcode並正在運行gcc-4.2。 MATLAB版本是2011A(v7.12)

在此先感謝1月

+0

所以我繼續在解決問題並固定在行3042,3044,3046和3048的警告:他們被創建'mxCreateScalarDouble'被MATLAB 6.5中的'mxCreateDoubleScalar'函數替代,並且在我的版本中已被刪除。所以這一切都消失了,同時還有第一個缺失的符號,這是由前面提到的'mxCreateDoubleScalar'替換引起的。 – 2012-04-01 14:22:05

回答

3

Heureka!我終於找到了它自己:既然我只是拍了很多的代碼從Linux的msound MEX編譯功能,問題是neccesary框架是如何在鏈接事實證明了" ... "(雙引號。 )的路徑和文件是錯誤的,它的工作,只有框架,實際上需要他們,因爲他們融洽相處,從而GCC通過。我將它們從addFile,addPath等中刪除,最後所有文件都被識別並鏈接了框架,以便所有丟失的符號都消失。我的頓悟主要是由this Stackoverflow question發起的,特別是它的正確答案。

在利益的情況下,這裏是全工作編譯器功能:

function compile_msound_mac 

bOldMexApi = false; 

disp('Building msound ...') 

szOptions = ''; 
szDefines = ''; 
szPaths = ''; 
szFiles = ''; 
szFrameworks = 'LDFLAGS="\$LDFLAGS'; 

szOptions = sprintf('%s %s', szOptions, '-output msound'  ); 

% Use the old MATLAB C API on newer MATLAB versions. 
if(~verLessThan('matlab','7.3')) 
    if(bOldMexApi) 
     % Use backward compatible old MATLAB C API 
     szOptions = sprintf('%s %s', szOptions, '-compatibleArrayDims'); 
    else 
     szOptions = sprintf('%s %s', szOptions, '-largeArrayDims'  ); 
    end 
end 

% 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 '  ); 
% Frameworks 
szFrameworks = addFramework (szFrameworks , 'CoreAudio' ); 
szFrameworks = addFramework (szFrameworks , 'AudioToolbox' ); 
szFrameworks = addFramework (szFrameworks , 'AudioUnit' ); 
szFrameworks = addFramework (szFrameworks , 'CoreServices' ); 
% 
% 
% % Closing Tag for Frameworks 
szFrameworks = sprintf('%s"', szFrameworks); 

% Build msound MEX-file using default compiler. 
eval([ 'mex', szOptions, szDefines, szPaths, szFiles , szFrameworks ]) 

disp('Done.') 

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 = addFramework(szCmd, szFramework) 
    szCmd = sprintf('%s -framework %s', szCmd, szFramework); 
相關問題