在OS X 10.9下使用Xcode 5.1与MATLAB 2012a编写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 <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.cppCXXFLAGS中没有-std=c++11时,会出现相同的错误。我在C/c++没有经验,但有一些库或标志,我需要添加来解决问题?任何建议,链接将是有益的。

谢谢。

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

使用预处理器将char16_t定义为uint16_t的宏(在stint .h中定义)。在 #include "mex.h"之前使用#define ,或者在命令行(mexCFLAGS)上设置它:

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

相关内容

  • 没有找到相关文章

最新更新