GCC C / C ++ MEX Matlab R2015 Mac OS X(带有OpenMP)不起作用

我正在尝试使用GCC / G ++在Matlab中编译一个非常简单的MEX文件…首先我检查了它已经安装在matlab中:!gcc

输出:/ usr / bin / gcc …之后,我尝试执行以下操作:

mex -v GCC =’/ usr / bin / gcc’hello.c

但它仍然使用XCode Clang进行编译……这是使用G ++和OPENMP库进行并行计算。

已知Mathworks不支持,但可能。

MATLAB仅支持Mac上的XCode 5.1+或6.0。

请参阅Mathworks: 支持的编译器和兼容编译器 – 版本R2015a中的受支持编译器列表


编辑!!!

甚至Windows也不支持GCC编译器。 但是,如果您可以在Windows中构建库,则会有一个名为Gnumex的第三方库,旨在为Matlab MEX提供MinGW或CygWin GCC编译器function。 看一看。

他们网站上的更新说改为Matlab已经破坏了它们的实用性。 但是,似乎有一个解决方法可通过此StackOverflowpost。

最后,我找到了一种解决问题的正确方法……首先,默认情况下文件mexopts.sh没有出现在文件夹中,需要打开终端并查找并创建它(然后Matlab会重定向到它使用MEX编译时自动执行):

find ~/ -name 'mexopts.sh' 

并将出现:

 /Users/FOO//.Trash/MATLAB_R2014a.app/bin/mexopts.sh 

然后,将其复制为:

 cp /Users/FOO//.Trash/MATLAB_R2014a.app/bin/mexopts.sh ~/.matlab/R2014a 

然后转到cd ~/.matlab/R2014a文件夹,并将用户的权限更改为:

 chmod u+rwx mexopts.sh 

然后,使用默认文本编辑器(建议使用Sublime文本)将其打开为:

 open mexopts.sh 

并编辑以下内容:将macosx10.7的显示位置更改为当前版本,在我的情况下为macos10.10,然后在( http://www.mathworks.com/matlabcentral/newsreader/view_thread/334250 )中修改以下行。 :

 # CC='xcrun -sdk macosx10.7 clang' #OLD CC='xcrun /usr/local/bin/gcc' #NEW # CXX='xcrun -sdk macosx10.7 clang++' #OLD CXX='xcrun /usr/local/bin/g++' #NEW # CLIBS="$CLIBS -lstdc++" #OLD CLIBS="$CLIBS -lstdc++ -I/usr/local/lib -lgomp" #directory <-I/usr/local/lib> #NEW #CXXLIBS="$MLIBS -lstdc++" #OLD CXXLIBS="$MLIBS -lstdc++ -I/usr/local/lib -lgomp" #NEW 

重要说明:确保您当前的G ++ / G ++ 4.9能够使用OpenMP进行编译,尝试在命令行中的hello world文件中包含

 g++-4.9 -o test hello.cpp -fopenmp 

要么

 g++ -o test hello.cpp -fopenmp 

也可能是文件已损坏且必须执行无法编译fortran因为dyld:库未加载 :

 brew rm cloog brew install cloog 

(但先检查一下)……

也有可能如果你不能用OMP编译就必须先做这里描述的几件事( 在OS X Yosemite上使用gcc编译器编译OpenMP程序 ):1。从http:/获得一个新的gcc编译器/hpc.sourceforge.net/ 2.放置一个新的可执行文件夹,由$ sudo tar -xvf gcc-4.9-bin.tar -C / 3.通过导出切换到它PATH = / usr / local / bin:$ PATH

最后,尝试编译您的MEX文件:

 mex hello.cpp COMPFLAGS="/openmp $COMPFLAGS" 

而已 … 。

我无法获得mexopts.sh工作方法。

相反,我首先遵循这一点,以确保我可以使用omp在xcode 下使用xcode: clang-omp

那么mex编译st

 mex CC='/usr/local/bin/clang-omp' -I/usr/local/include -I/usr/local/lib /usr/local/lib/libiomp5.dylib test.c 

然而,当我在Matlab和基于纯终端的c之间进行比较时,我得到了一些奇怪的结果。 常见的工作,我把文件放在“do_work.c”中:

 double do_work(int maxit){ double tmp,x,x2; int numThreads=0; numThreads = omp_get_max_threads() ; // numThreads = 4; printf("Setting max num threads to %d.\n",numThreads); omp_set_num_threads(numThreads); // int Nthreads=omp_get_num_threads(); tmp = 0.0; x2 = 0.0; #pragma omp parallel for shared(tmp,x2) private(x) for (int i=0;i 

我可以使用这个包装文件从命令行编译它:

 #include "stdio.h" #include "math.h" #include  #include "do_work.c" double do_work(int maxit); int main(int argc, const char * argv[]) { do_work(10000); return 0; } 

我通过运行编译它

 clang-omp -fopenmp test_c_wrapper.c 

我也可以使用以下代码从Matlab接口:

 #include "mex.h" #include  #include "math.h" #include "stdio.h" #include "do_work.c" double do_work(int maxit); void mexFunction(int nlhs, mxArray *plhs[],int nrhs,const mxArray *prhs[]) { do_work(10000); return; } 

要从Matlab编译它,将它保存为test.c并运行我提到的第一个mex语句。 但是,结果真的很奇怪。 看起来好像Matlab甚至没有使用omp。 同时,尽管Matlab似乎在串行模式下运行,但Matlab实际上比基于终端的运行速度更快? 奇怪...而且,omp_get_max_threads()表现得很奇怪,每次从Matlab调用时它都不会返回相同的数字,即使它是从终端执行的。