使用gcc和Matlab在mac上编译openmp

标签 c macos matlab gcc

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

据我所知,xcode 不允许这样做,所以我安装了 gcc。我能够很好地编译程序,并在本地运行它,但它链接到默认情况下在 mac 上不可用的依赖项(我认为)。特别是,otool 指向 libgomp.1.dylib 和 libgcc_s.1.dylib,据我所知,它们不是标准操作系统安装的一部分。

我能够静态链接 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 来实现它。

最佳答案

所以,我幸运地绕过了 mex 编译基础设施,只是将命令直接传递给 gcc。首先,我使用“-v”选项运行我当前拥有的内容,以查看 Matlab 发送给编译器的命令。我随后进行的 4 次编辑是,1) 删除了 Matlab 创建的疯狂对象输出路径(使用一些临时文件夹) 2) 删除了对 xcode 的引用 3) 向 mex 文件夹添加了一个 -L 指令(尽管我可能会更改它到正确的 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 命令窗口中...

关于使用gcc和Matlab在mac上编译openmp,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42741091/

相关文章:

c - 如何在 Contiki 中将链接本地地址转换为全局地址

java - 如何从 C 程序运行 Java 程序?

objective-c - 包含一个主要可执行文件和一个辅助应用程序的应用程序包

java - Maven: "Error reading archetype catalog",不在代理后面

matlab - 如何在 matlab 中为下图的每张图片添加字幕

c - 如何理解 SO_REUSEPORT 可以简化客户端和服务器之间进行有状态对话的任务?

c - 为什么我可以使用 CLion 修改字符串文字?

java - [JAVA]MAC OS 上 FileInputStream 的路径参数错误

MATLAB FFT xaxis限制了困惑和fftshift

matlab - 如何强制 matlab 在图 X 和 Y 上显示足够的数字?