在OS X 10.9下使用Xcode 5.1使用MATLAB 2012a的Mex文件

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++11CXXFLAGS我之后才能编译使用.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++11CXXFLAGS.我没有C/C++的经验,但是我需要添加一些库或标志来解决问题吗?任何建议,链接都会有所帮助.

谢谢.

cha*_*pjc 7

当无法通过CXXFLAGS使用C++ 11时,无论是由于编译器限制还是因为文件必须只是C,这里有一些可能的解决方法,不涉及破解MATLAB安装(tmwtypes.h):

使用预处理器定义char16_tuint16_t(在stdint.h中定义)的宏.使用#define 之前 #include "mex.h",或者只是在命令行(mexCFLAGS)上设置它:

-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)

  • `-Dchar16_t = UINT16_T`在`mexopts.sh`中为我工作. (6认同)
  • 在mexopts.ah的c标志中包含-Dchar16_t = uint16_T解决了所有问题.谢谢,@ chappjs. (4认同)