使用gcc和Matlab

时间:2017-03-11 21:53:47

标签: c macos matlab gcc

我正在尝试编译一个在mac上使用openmp的Matlab mex程序。我想将其分发给其他Matlab用户,以便他们可以使用它,而无需安装其他软件。

据我所知,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 个答案:

答案 0 :(得分:1)

所以,我有一些运气绕过mex编译基础设施并直接将命令传递给gcc。首先,我使用了' -v'用于查看Matlab发送给编译器的命令的选项。我做的4次编辑是,1)删除了Matlab创建的疯狂对象输出路径(使用一些临时文件夹)2)删除了对xcode的引用3)将一个-L指令添加到mex文件夹中(虽然我可能会更改此到正确的gcc目录 - 我只是习惯于在本地复制文件以进行编译,因为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命令窗口中运行...