【发布时间】: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.cpp 而CXXFLAGS 中没有-std=c++11 时,使用了相同的错误。我在 C/C++ 方面没有经验,但是否需要添加一些库或标志来解决问题?任何建议,链接都会有所帮助。
谢谢。
【问题讨论】:
-
我假设您在编辑
mexopts.sh文件后运行了mex -setup? -
是的,我做到了。我正在使用
mexopts.sh的编辑版本 -
无法使用 C++11 的另一种解决方法是 posted in this updated answer。