Gna*_*uha 3 c c++ matlab opencv c++11
我正在尝试为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'
Run Code Online (Sandbox Code Playgroud)
只有在我添加-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");
}
Run Code Online (Sandbox Code Playgroud)
我把它保存为test.c编译.这是我得到的输出
mex test.c
Run Code Online (Sandbox Code Playgroud)
在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.
Run Code Online (Sandbox Code Playgroud)
使用mex时出错(第206行)无法成功完成.
当文件保存为使用了同样的错误test.cpp,而不-std=c++11在CXXFLAGS.我没有C/C++的经验,但是我需要添加一些库或标志来解决问题吗?任何建议,链接都会有所帮助.
谢谢.
当无法通过CXXFLAGS使用C++ 11时,无论是由于编译器限制还是因为文件必须只是C,这里有一些可能的解决方法,不涉及破解MATLAB安装(tmwtypes.h):
使用预处理器定义char16_t为uint16_t(在stdint.h中定义)的宏.使用#define 之前 #include "mex.h",或者只是在命令行(mex或CFLAGS)上设置它:
-Dchar16_t=uint16_t
Run Code Online (Sandbox Code Playgroud)
或者,typedef在包括mex.h之前再添加一个:
typedef uint16_t char16_t;
Run Code Online (Sandbox Code Playgroud)
要获得uint16_t,你需要#include <stdint.h>.或尝试UINT16_T(上限).
最后,如果使用C(编译.c文件),uchar.h 可能会定义一个char16_t宏,具体取决于编译器支持的C标准的修订版本:
/* In myMexFile.c */
#include <uchar.h>
Run Code Online (Sandbox Code Playgroud)