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