【问题标题】:MATLAB and C/C++. How to choose between different C/C++ specificationsMATLAB 和 C/C++。如何在不同的 C/C++ 规范之间进行选择
【发布时间】:2011-01-30 21:39:46
【问题描述】:

使用 Visual C++ 2010 的编译器 (cl.exe) 从 mex 中的 third-party library 编译 C++ 文件时遇到以下问题。

编译器在如下语句中多行抱怨::

plhs[i] = mxCreateNumericMatrix(nclass, 1, mxDOUBLE_CLASS, 0);

与:

错误 C2664: 'mxCreateNumericMatrix_730':不能 将参数 4 从“int”转换为 'mx复杂度'

原因似乎是mxCreateNumericMatrixtakes是一个枚举类型作为输入参数4,称为mxComplexity,即defined作为typedef enum mxComplexity {mxREAL=0, mxCOMPLEX};。换句话说,编译器抱怨它不能从 int 隐式转换为 enum 类型

有趣的是,library in question 应该可以轻松编译,而无需更改其中的任何内容。

因此,我的问题是:有没有办法告诉 mexcl.exe(或 >gcc,如果我在 Unix 中这样做),我想做一个 C 风格 类型的隐式转换?

注意 1: 不幸的是,我不知道该库是按照什么 C++ 标准编写的。

注意 2: 以防万一,这是我对 mex 的配置(默认情况下由 MATLAB 设置,在运行 mex -setup 之后):

 CompilerExecutable: 'cl'
              CompilerFlags: '/c /Zp8 /GR /W3 /EHs /D_CRT_SECURE_NO_DEPRECATE /D_SCL_SECURE_NO_DEPRECATE /D_SECURE_SCL=0 /DMATLAB_MEX_FILE /nologo /MD'
          OptimizationFlags: '/O2 /Oy- /DNDEBUG'
                 DebugFlags: '/Z7'
           LinkerExecutable: 'link'
                LinkerFlags: '/dll /export:%ENTRYPOINT% /LIBPATH:"%LIBLOC%" libmx.lib libmex.lib libmat.lib /MACHINE:X64 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /manifest /incremental:NO /implib:"%LIB_NAME%.x" /MAP:"%OUTDIR%%MEX_NAME%%MEX_EXT%.map"'
    LinkerOptimizationFlags: ''
           LinkerDebugFlags: '/debug /PDB:"%OUTDIR%%MEX_NAME%%MEX_EXT%.pdb"'

【问题讨论】:

  • 也许是个愚蠢的问题,但为什么要使用文字 0 而不是 mxREAL?
  • @Christoffer,这是一个很好的问题,但我不知道为什么库开发人员选择使用文字而不是枚举类型。无论如何,如果可以避免的话,我宁愿不更改库的源代码。
  • @AmV:似乎他们确实为 Win32 和 64 位提供了预编译的二进制文件:code.google.com/p/randomforest-matlab/downloads/list
  • @Amro,感谢您对此进行调查,但我仍然感到困惑。 @Alex 在下面说 C++ 不允许隐式转换(证实了我最初的猜测)。您之前仍然说过您设法编译了旧版本的库(具有隐式转换的库)。库附带的编译脚本使用 cl.exe(当它看到 .Cpp 扩展名时默认为 C++)和 g++(而不是 gcc)。
  • @AmV: 既然我明白了这个问题,我和你一起困惑......举个简单的例子:pastebin.com/fmJqkdir,这个程序可以正确编译为 C,但会抛出编译错误作为 C++(但不知何故,mex 在旧版本的库中是成功的,至少对我来说是这样!)

标签: c++ c visual-studio-2010 matlab g++


【解决方案1】:

C++ 不允许从 int 隐式转换为枚举值(永远!在 C++98、2003、0x 中没有),与 C 不同,因此您需要使用实际的枚举值这样的参数。

或者您可以编译为 C,因为他们编写的代码不是 C++(由于上述原因)。

注 1:不幸的是,我不知道 该库是什么 C++ 标准 写的

没关系,C++ 标准是向后兼容的,而且这段代码肯定没有使用 C++0x 中的新东西,所以你的编译器没问题。更改 C++ 编译模式将不允许您隐式进行上述转换。

【讨论】:

  • 谢谢。这就说得通了。有趣的是,该库的作者声称 (goo.gl/5TbN1) 他能够在 Windows 上使用 Visual C++ express 编译它,在 Linux 上使用 g++ 编译它(事实上,我无法使用 /Tc 使用 gl.exe 编译它选项,它强制执行 C 编译,并且库为 Linux 安装提供的 make 文件使用 g++)。
【解决方案2】:

首先,弄清楚您使用的是什么语言。你是用 C,还是用 C++?

这是它们不兼容的一个领域。

【讨论】:

  • 据我所知,该程序是用 C++ 编写的。除其他外,这些文件的扩展名为 .cpp,最值得注意的是,Linux 随附的 Makefile 使用 g++
  • 这解释了为什么你不能隐式转换类型。 “有问题的库”声称您可以,大概是因为他们假设您使用的是 C。
猜你喜欢
  • 2011-07-02
  • 2011-07-11
  • 2011-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-09
  • 2013-09-12
相关资源
最近更新 更多