2017-03-11 69 views
2

我想編譯一個在mac上使用openmp的Matlab mex程序。我想分發給其他Matlab用戶,以便他們可以使用它,而不需要安裝其他軟件。使用gcc和Matlab在mac上編譯openmp

從我可以告訴,xcode不允許這樣做,所以我已經安裝了gcc。我能夠很好地編譯程序,並在本地運行它,但它鏈接到在Mac上默認不可用的依賴項(我認爲)。尤其是,otool指向libgomp.1.dylib和libgcc_s.1.dylib,從我可以告訴的是,它不是標準的os安裝的一部分。

我能夠靜態鏈接到libgomp.a,它從一些測試(重命名.dylib文件)似乎已經正確地刪除了依賴關係(即,當我重命名dylib文件時代碼仍然有效,而otool沒有也列出它)。但是,我不確定如何刪除libgcc_s.1.dylib依賴項。在Windows中,本地複製dll將解決此問題,但這在Mac上不起作用。我無法找到該依賴關係的靜態庫。相反,我試圖讓某些版本的rpath工作(使用本地複製的文件),但是otool始終指向/usr/local/opt/gcc/lib/gcc/6/libgcc_s.1.dylib

MATLAB命令的相關部分是:

'LDFLAGS="$LDFLAGS -fopenmp -Wl,-rpath,$ORIGIN/"' and 
'-lgcc_s.1' 

我找到了一個解決方案在這裏:Openmp with mex in Matlab on mac

然而,另一個項目,我用gcc特定的命令,所以我真的很想得到用gcc該工作。

回答

1

所以,我有一些運氣繞過了mex編譯基礎架構,只是直接將命令傳遞給gcc。首先,我運行了我目前使用'-v'選項查看Matlab發送給編譯器的命令。然後我做了4個編輯,1)刪除了Matlab創建的瘋狂對象輸出路徑(使用一些臨時文件夾)2)刪除了對xcode的引用3)在mex文件夾中添加了-L指令(儘管我可能會更改這個到適當的海灣合作委員會目錄 - 我只是習慣複製文件在本地編譯,由於Matlab問題)和4)添加'-static-libgcc'(我發誓我曾嘗試...)哦,5)我還更新了分OSX版本

這是最後一行,前兩個剛把-o選項中刪除

/usr/local/Cellar/gcc/6.3.0_1/bin/gcc-6 -Wl,-twolevel_namespace -static-libgcc -L"/Users/jim/Documents/repos/matlab_git/matlab_sl_modules/plotBig_Matlab/+big_plot/private" -undefined error -arch x86_64 -mmacosx-version-min=10.12 -bundle -Wl,-exported_symbols_list,"/Applications/MATLAB_R2017a.app/extern/lib/maci64/mexFunction.map" -fopenmp reduce_to_width_mex.o c_mexapi_version.o -O -Wl,-exported_symbols_list,"/Applications/MATLAB_R2017a.app/extern/lib/maci64/c_exportsmexfileversion.map" libgomp.a -L"/Applications/MATLAB_R2017a.app/bin/maci64" -lmx -lmex -lmat -lc++ -o reduce_to_width_mex.mexmaci64 

哦,最後我要提到我只是在終端運行這些命令,而不是在Matlab命令窗口中...