没有xcode的matlab mex,但是有独立的命令行工具

时间:2016-10-14 21:38:38

标签: c xcode matlab compilation mex

我想在不安装xcode的情况下编译mex文件,只使用命令行工具(来自苹果开发者中心)。

Apple命令行工具安装编译器,并将标准库和标头添加到比xcode(几GB)小得多的软件包中。

在Linux上运行mex是可能的 - 我认为没有理由为什么matlab mex应该需要macos所需的巨大SDK。一个漫长的试验和错误和黑客配置文件的晚上没有帮助。有没有人有一个如何在matlab外编译mex文件的最小工作示例,或者在没有安装xcode的情况下使用mex的简单方法?

最诚挚的问候,马格努斯

2 个答案:

答案 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="&#10;agreed=$$ &#10; if echo $agreed | grep -E '[\.\&quot;]' >/dev/null; then &#10; lhs=`expr &quot;$agreed&quot; : '\([0-9]*\)[\.].*'` &#10;  rhs=`expr &quot;$agreed&quot; : '[0-9]*[\.]\(.*\)$'` &#10; if echo $rhs | grep -E '[\.&quot;]' >/dev/null; then &#10; rhs=`expr &quot;$rhs&quot; : '\([0-9]*\)[\.].*'` &#10; fi &#10; if [ $lhs -gt 4 ] || ( [ $lhs -eq 4 ] &amp;&amp; [ $rhs -ge 3 ] ); then &#10; echo $agreed &#10; else &#10; exit 1&#10; fi &#10; fi" />
            </and>
        </XCODE_AGREED_VERSION -->

一些注意事项:

  1. 默认情况下,这些文件是只读的,您需要在该目录中发出sudo chmod 644 *

  2. 在注释掉所有必要文件后,在matlab中发出以下命令: mex -setup C++

  3. 然后你就完成了