最近设计滑模控制器需要用MATLAB Simulink中的User-Defined Function,写好Function后编译报错。报错信息为:
在MathWorks论坛上有这个问题的解决方案。大致就是去App Store上安装Xcode就可以了,然而我并不想安装臃肿的Xcode且我已经安装了Xcode command line tool。这篇文章将教你如何花式配置mex。
更改mex的XML配置
打开MATLAB,并在其Command Line下输入:
这里MATLAB左侧的Current Folder中应有三个文件,分别是clang_maci64.xml
,clang++_maci64.xml
和gfortan.xml
,分别对应了c文件,cpp文件和fortan的编译配置。由于Simulink只需要编译c文件,所以仅更改clang_maci64.xml
就可以了。clang++_maci64.xml
的修改方法与clang_maci64.xml
类似,就不多加说明了。
直接使用MATLAB打开clang_maci64.xml
,找到以下部分,并将其用<!--> <-->
注释掉。这将会使编译器在/usr/include
中搜索头文件,而非Xcode的路径。
回到MATLAB的Command Window,并输入
此时应该输出
这表明此时mex已经找到并使用gcc了,但是Simulink编译仍然会报以下错误:
这是因为在clang_maci64.xml
33行处,还有其他的一些行
引用了我们刚才注释掉的内容$SDKVER
和$ISYSROOT
。
需要注意的是此时并不应该再修改这个文件,需要在Command Window中输入
打开mex_C_maci64.xml
继续修改。需要将文件中所有的$SDKVER
更改为10.11
,并将ISYSROOT
更改为/usr/bin
。
至此XML文件修改完毕,然而打开Simulink还是不能编译通过。
复制头文件
Simulink报错的内容大概是在simulink/include/
文件夹下找不到头文件,手动将/usr/include/
中的所有文件复制到/Applications/MATLAB_R2014a.app/simulink/include/
下即可。现在重新编译Simulink的model应该就可以顺利通过了。
总结
之前在解决mex问题的时候搜索到stackoverflow上的这个答案,不过按照回答者提出的方案仍然报错,于是自己动手修改了一些细节上的内容,希望可以帮助到被这个问题困扰的朋友们。