我想在不安装xcode的情况下编译mex文件,只使用命令行工具(来自苹果开发者中心)。
Apple命令行工具安装编译器,并将标准库和标头添加到比xcode(几GB)小得多的软件包中。
在Linux上运行mex是可能的 - 我认为没有理由为什么matlab mex应该需要macos所需的巨大SDK。一个漫长的试验和错误和黑客配置文件的晚上没有帮助。有没有人有一个如何在matlab外编译mex文件的最小工作示例,或者在没有安装xcode的情况下使用mex的简单方法?
最诚挚的问候,马格努斯
答案 0 :(得分:4)
花了更多的时间后,我结束了学习更多的东西并回答了我自己的问题。如果将来有人需要,我会在这里发布我的解决方案。
确保电源线已连接到计算机并且已安装MATLAB,并且还要安装Apple的命令行工具。然后调用以下makefile从终端编译arrayProduct.c(自带matlab),如下所示:
make mex=arrayProduct
将此makefile代码放在名为makefile的文件中的同一文件夹中(如果必须,请根据自己的需要编辑):
all:
clang -c\
-DMX_COMPAT_32 \
-DMATLAB_MEX_FILE \
-I"/Applications/MATLAB_R2016b.app/extern/include" \
-I"/Applications/MATLAB_R2016b.app/simulink/include" \
-fno-common \
-arch x86_64 \
-fexceptions \
-O2 \
-fwrapv \
-DNDEBUG \
"/Applications/MATLAB_R2016b.app/extern/version/c_mexapi_version.c" \
$(mex).c
clang \
-Wl,-twolevel_namespace \
-undefined error \
-arch x86_64 \
-bundle \
-Wl,-exported_symbols_list,"/Applications/MATLAB_R2016b.app/extern/lib/maci64/mexFunction.map" \
$(mex).o \
c_mexapi_version.o \
-O \
-Wl,-exported_symbols_list,"/Applications/MATLAB_R2016b.app/extern/lib/maci64/c_exportsmexfileversion.map" \
-L"/Applications/MATLAB_R2016b.app/bin/maci64" \
-lmx \
-lmex \
-lmat \
-lc++ \
-o $(mex).mexmaci64
上面的makefile是一个最基本的工作示例,您应该编辑它以符合您的要求。
编辑: 选项2 您可以通过编辑包含编译器选项的xml文件,使MATLAB了解如何使用命令行工具。打开位于的文件 /用户/用户名/库/应用程序支持/ MathWorks / MATLAB / R2016b / mex_C_maci64.xml
删除与ISYSROOT相关的所有编译器和链接器选项。这将使编译器在/ usr / include等中搜索头文件,而不是在XCode中的SDK文件夹中搜索。
答案 1 :(得分:2)
嗯,我有另一个选择:
编辑/Applications/MATLAB_R2016b.app/bin/maci64/mexopts
下的文件(可能应该有3.xml文件,所有文件都需要相同的修改)。
找到<XCODE_AGREED_VERSION>
部分,注释整个xml标记,例如用<!--
和-->
包裹它们:
<!--XCODE_AGREED_VERSION>
<and diagnostic="Xcode is installed, but its license has not been accepted. Run Xcode and accept its license agreement." >
<or>
<cmdReturns name="defaults read com.apple.dt.Xcode IDEXcodeVersionForAgreedToGMLicense"/>
<cmdReturns name="defaults read /Library/Preferences/com.apple.dt.Xcode IDEXcodeVersionForAgreedToGMLicense"/>
</or>
<cmdReturns name=" agreed=$$ if echo $agreed | grep -E '[\.\"]' >/dev/null; then lhs=`expr "$agreed" : '\([0-9]*\)[\.].*'` rhs=`expr "$agreed" : '[0-9]*[\.]\(.*\)$'` if echo $rhs | grep -E '[\."]' >/dev/null; then rhs=`expr "$rhs" : '\([0-9]*\)[\.].*'` fi if [ $lhs -gt 4 ] || ( [ $lhs -eq 4 ] && [ $rhs -ge 3 ] ); then echo $agreed else exit 1 fi fi" />
</and>
</XCODE_AGREED_VERSION -->
一些注意事项:
默认情况下,这些文件是只读的,您需要在该目录中发出sudo chmod
644 *
在注释掉所有必要文件后,在matlab中发出以下命令:
mex -setup C++
然后你就完成了