在OS X 10.9和MATLAB 2012a下使用Xcode 5.1的Mex文件
我正在尝试为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 #include #include 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:错误:未知类型名称’char16_t’typedef char16_t CHAR16_T; 生成^ 1错误。
mex: compile of ' "test.c"' failed.
使用mex时出错(第206行)无法成功完成。
当文件在CXXFLAGS
没有-std=c++11
保存为test.cpp
时,使用了相同的错误。 我没有C / C ++的经验,但是我需要添加一些库或标志来解决问题吗? 任何建议,链接都会有所帮助。
谢谢。
当无法通过CXXFLAGS使用C ++ 11时 ,无论是由于编译器限制还是因为文件必须只是C,这里有一些可能的解决方法,不涉及破解MATLAB安装(tmwtypes.h):
使用预处理器将char16_t
定义为uint16_t
的宏(在stdint.h中定义)。 在 #include "mex.h"
之前使用#define
,或者只在命令行( mex
或CFLAGS
)上设置它:
-Dchar16_t=uint16_t
或者,在包含mex.h之前再添加一个typedef
:
typedef uint16_t char16_t;
要获取uint16_t
,您需要#include
。 或者尝试UINT16_T
(上限)。
最后,如果使用C(编译.c文件), uchar.h 可以定义一个char16_t
宏,具体取决于编译器支持的C标准的修订版本:
/* In myMexFile.c */ #include