【问题标题】:Matlab mex without xcode, but with standalone command line toolsMatlab mex 没有 xcode,但有独立的命令行工具
【发布时间】:2017-02-24 10:19:47
【问题描述】:

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

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

在 linux 上运行 mex 是可能的 - 我认为 matlab mex 没有理由需要 macos 所需的巨大 SDK。一个漫长的夜晚反复试验和破解配置文件并没有帮助。有没有人有一个关于如何在 matlab 之外编译 mex 文件的最小工作示例,或者在没有安装 xcode 的情况下使用 mex 的简单方法?

最好的问候,马格努斯

【问题讨论】:

  • 我认为您可以从 homebrew 安装 gcc 并基本上使用与 linux 相同的编译器。我的机器上都有,我可以稍后检查 matlab 是否能够看到两者。
  • 其实我觉得mac上不支持gcc,只能用xcode,不好意思。
  • 谢谢!如下所示,我自己找到了解决方案。
  • 我偶然发现了这个话题gcc mex。没试过,但可能很有趣。
  • 谢谢!但是现在,我自己的解决方案中的选项 2 运行良好!

标签: c xcode matlab compilation mex


【解决方案1】:

好吧,我在这里有另一个选择: 编辑/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++

那么你就完成了

【讨论】:

  • 在“投入”了几个小时试图解决这个问题之后,我想说谢谢你的解决方案。
  • 非常感谢!我可以确认它仍然适用于更高版本(2019b)
  • 这在 MATLAB 2021b 中仍然有效,谢谢!
【解决方案2】:

花了更多时间后,我最终学到了更多东西并回答了我自己的问题。如果其他人将来需要它,我会在这里发布我的解决方案。

确保电源线已连接到您的计算机并安装了 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 文件夹中搜索头文件。

【讨论】:

  • 谢谢,解决方案(选项 2)适用于我的机器。
  • 您可能不想使用 MX_COMPAT_32,除非您的 MEX 文件源代码非常旧并且使用 int 而不是 mwSize 等。有关在编译期间定义哪些宏的更多信息,请参阅this question on Matlab Answers
猜你喜欢
  • 2013-04-28
  • 1970-01-01
  • 1970-01-01
  • 2015-12-21
  • 2013-09-27
  • 1970-01-01
  • 2019-03-02
  • 1970-01-01
  • 2016-08-30
相关资源
最近更新 更多