Matlab mex 没有 xcode,但有独立的命令行工具
Matlab mex without xcode, but with standalone command line tools
我想编译 mex 文件而不安装 xcode,仅使用命令行工具(来自苹果开发者中心)。
Apple Command Line Tools 安装编译器并将标准库和 headers 添加到系统中的包比 xcode(几 GB)小得多。
运行 linux 上的 mex 是可能的 - 我看不出为什么 matlab mex 应该需要 macos 所需的巨大 SDK。一个漫长的晚上反复试验和破解配置文件并没有帮助。有没有人有关于如何在 matlab 之外编译 mex 文件的最小工作示例,或者没有安装 xcode 就可以使用 mex 的简单方法?
此致,马格纳斯
花了更多时间后,我学到了更多东西并回答了我自己的问题。如果将来有人需要,我会 post 在这里提供我的解决方案。
确保电源线已连接到您的计算机并安装了 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 了解如何使用命令行工具。打开文件位于
/User/username/Library/Application Support/MathWorks/MATLAB/R2016b/mex_C_maci64.xml
删除所有与 ISYSROOT 相关的编译器和链接器选项。这将使编译器在 /usr/include 等中搜索头文件,而不是在 XCode 中的 SDK 文件夹中搜索。
好吧,我还有另一个选择:
编辑/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++
那么你就完成了
我想编译 mex 文件而不安装 xcode,仅使用命令行工具(来自苹果开发者中心)。
Apple Command Line Tools 安装编译器并将标准库和 headers 添加到系统中的包比 xcode(几 GB)小得多。
运行 linux 上的 mex 是可能的 - 我看不出为什么 matlab mex 应该需要 macos 所需的巨大 SDK。一个漫长的晚上反复试验和破解配置文件并没有帮助。有没有人有关于如何在 matlab 之外编译 mex 文件的最小工作示例,或者没有安装 xcode 就可以使用 mex 的简单方法?
此致,马格纳斯
花了更多时间后,我学到了更多东西并回答了我自己的问题。如果将来有人需要,我会 post 在这里提供我的解决方案。
确保电源线已连接到您的计算机并安装了 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 了解如何使用命令行工具。打开文件位于 /User/username/Library/Application Support/MathWorks/MATLAB/R2016b/mex_C_maci64.xml
删除所有与 ISYSROOT 相关的编译器和链接器选项。这将使编译器在 /usr/include 等中搜索头文件,而不是在 XCode 中的 SDK 文件夹中搜索。
好吧,我还有另一个选择:
编辑/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++
那么你就完成了