【问题标题】:Mex files using Xcode 5.1 under OS X 10.9 with MATLAB 2012a在 OS X 10.9 和 MATLAB 2012a 下使用 Xcode 5.1 的 Mex 文件
【发布时间】:2014-04-21 20:11:15
【问题描述】:

我正在尝试为 OpenCV (3.0.0) 编译开发人员版本,但是我无法将我的系统配置为 mex C 文件。我尝试遵循 stackoverflow 的建议,目前我可以混合 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.cppCXXFLAGS 中没有-std=c++11 时,使用了相同的错误。我在 C/C++ 方面没有经验,但是否需要添加一些库或标志来解决问题?任何建议,链接都会有所帮助。

谢谢。

【问题讨论】:

  • 我假设您在编辑mexopts.sh 文件后运行了mex -setup
  • 是的,我做到了。我正在使用 mexopts.sh 的编辑版本
  • 无法使用 C++11 的另一种解决方法是 posted in this updated answer

标签: c++ c matlab opencv c++11


【解决方案1】:

当无法use C++11 via CXXFLAGS 时,无论是由于编译器限制还是因为文件只能是 C,以下是一些可能的解决方法,不涉及破解 MATLAB 安装 (tmwtypes.h):

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

-Dchar16_t=uint16_t

或者,在包含 mex.h 之前再次添加 typedef

typedef uint16_t char16_t;

要获得uint16_t,您需要#include &lt;stdint.h&gt;。或者试试UINT16_T(大写)。

最后,如果使用 C(编译 .c 文件),uchar.h可以定义一个 char16_t 宏,具体取决于您的编译器支持的 C 标准的版本:

/* In myMexFile.c */
#include <uchar.h>

【讨论】:

  • 在 mexopts.ah 的 c 标志中包含 -Dchar16_t=uint16_T 解决了所有问题。谢谢,@chappjs。
  • -Dchar16_t=UINT16_Tmexopts.sh 为我工作。
  • 一位匿名用户报告说#define char16_t UINT16_T 有效。大写2分,小写1分。
  • mexopts.sh 中再次投票给-Dchar16_t=UINT16_T(与@Francesco 所说的相同)。
  • 请注意@Francesco 和其他人的评论末尾的大写“T”。这对我有用,但是在接受的答案中将其保留为小写对我来说失败了。
猜你喜欢
  • 1970-01-01
  • 2013-11-15
  • 2014-07-12
  • 2014-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-12
  • 2013-11-01
相关资源
最近更新 更多