我正在尝试为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>