在OS X 10.9下使用Xcode 5.1与MATLAB 2012a编写Mex文件
Mex files using Xcode 5.1 under OS X 10.9 with MATLAB 2012a
我正在尝试为OpenCV(3.0.0)编译开发人员构建,但是我无法将我的系统配置为mex C文件。我试着遵循stackoverflow的建议,目前我可以mex c++文件,但不是c的。我所做的是编辑mexopts.sh
,以便使用正确的SDKROOT
,我还将部署目标更改为10.9
。
我的mexopts.sh如下所示:
#PATCH: MacOSX10.8 // updated manually to 10.9
CC='llvm-gcc'
CXX='llvm-g++'
SDKROOT='/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk/'
#SDKROOT='/'
MACOSX_DEPLOYMENT_TARGET='10.9'
ARCHS='x86_64'
# StorageVersion: 1.0
# CkeyName: GNU C
# CkeyManufacturer: GNU
# CkeyLanguage: C
# CkeyVersion:
CFLAGS="-fno-common -no-cpp-precomp -arch $ARCHS -isysroot $SDKROOT -mmacosx-version-min=$MACOSX_DEPLOYMENT_TARGET"
CFLAGS="$CFLAGS -fexceptions"
CLIBS="$MLIBS"
COPTIMFLAGS='-O2 -DNDEBUG'
CDEBUGFLAGS='-g'
CLIBS="$CLIBS -lstdc++"
# C++keyName: GNU C++
# C++keyManufacturer: GNU
# C++keyLanguage: C++
# C++keyVersion:
# OLD
#CXXFLAGS="-fno-common -no-cpp-precomp -fexceptions -arch $ARCHS -isysroot $SDKROOT -mmacosx-version-min=$MACOSX_DEPLOYMENT_TARGET"
# NEW
CXXFLAGS="-fno-common -no-cpp-precomp -fexceptions -arch $ARCHS -isysroot $SDKROOT -mmacosx-version-min=$MACOSX_DEPLOYMENT_TARGET -std=c++11"
CXXLIBS="$MLIBS -lstdc++"
CXXOPTIMFLAGS='-O2 -DNDEBUG'
CXXDEBUGFLAGS='-g'
只有在我将-std=c++11
添加到CXXFLAGS
之后,我才能编译使用.cpp
扩展保存的简单c++代码。下面是我要编译的文件
#include <math.h>
#include <matrix.h>
#include <mex.h>
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
mexPrintf("Hello World!n");
}
我将其保存为test.c
并编译。下面是我得到的输出
mex test.c
包含在test.c:2的文件中:/Applications/MATLAB_R2012a.app/extern/include/matrix.h:295/Applications/MATLAB_R2012a.app/extern/include/tmwtypes.h:819:9: error: unknown type名字"char16_t"typepedef char16_t;^生成1个错误。
mex: compile of ' "test.c"' failed.
使用mex出错(第206行)无法成功完成。
当文件保存为test.cpp
而CXXFLAGS
中没有-std=c++11
时,会出现相同的错误。我在C/c++没有经验,但有一些库或标志,我需要添加来解决问题?任何建议,链接将是有益的。
谢谢。
当不可能通过CXXFLAGS使用c++ 11时,无论是由于编译器限制还是因为文件必须只有C,这里有一些可能的解决方案,不涉及黑客MATLAB安装(tmwtypes.h):
使用预处理器将char16_t
定义为uint16_t
的宏(在stint .h中定义)。在 #include "mex.h"
之前使用#define
,或者在命令行(mex
或CFLAGS
)上设置它:
-Dchar16_t=uint16_t
或者,在包含ext .h:
之前,再添加一个typedef
typedef uint16_t char16_t;
要获取uint16_t
,您需要获取#include <stdint.h>
。或者试试UINT16_T
(caps)。
最后,如果使用C(编译.c文件),uchar.h 可以定义char16_t
宏,这取决于编译器支持的C标准的哪个版本:
/* In myMexFile.c */
#include <uchar.h>
- 在C++STL中是否有Polyval(Matlab函数)等价物?
- 有可能在Armadillo中复制MATLAB circshift方法吗
- 使用 MATLAB 编码器生成C++代码:编译错误"undefined reference to `rgb2gray_tbb_real64'"
- MATLAB to C++: csvread() not supported by MATLAB Coder
- 加载由 MATLAB Coder 生成的带有函数的 DLL,该函数调用外部函数
- MATLAB:跟踪imufilter对象中的状态变化
- 如何将 c++ 中的客户端 TCP 的替身列表发送到 Matlab 中的 TCP 服务器?
- 将三角函数的正确值与matlab进行比较
- 连接 MATLAB 和 Visual Studios 的问题
- 如何将C++连接到 Matlab
- 如何发送 Mat H=findHomography 返回 Matlab
- 如何在C++中编写 MATLAB fix(X) 函数?
- 提供变量作为 MATLAB 系统命令的输入参数,以便C++可执行文件
- 有没有更好的方法可以使用特征/C++实现 matlab 的逻辑索引?
- 当我运行MEX文件时,MATLAB崩溃
- 从 MATLAB 到 C++:相当于带有选项 'remove' 的 bwmorph
- MATLAB的imfinfo in openCV
- 将C++中的多个参数传递给MatLab共享库函数
- 将 matlab 数组(MAT-文件)转换为C++数组
- 在OS X 10.9下使用Xcode 5.1与MATLAB 2012a编写Mex文件