Matlab/MEX中使用Visual Studio C++时#include无法正常工作
问题:Matlab MEX编译C++代码添加标准库头文件后触发语法错误
原本在Matlab中运行正常的C++/MEX仿真代码,添加#include <random>或#include <algorithm>这类C++标准库头文件后,出现大量来自VC标准库头文件(如cstdlib)的语法错误,示例错误如下:
C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\INCLUDE\cstdlib(19) : error C2054: expected '(' to follow 'using' C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\INCLUDE\cstdlib(19) : error C2061: syntax error : identifier 'using' C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\INCLUDE\cstdlib(21) : error C2061: syntax error : identifier 'using' C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\INCLUDE\cstdlib(21) : error C2061: syntax error : identifier 'abs' C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\INCLUDE\cstdlib(21) : error C2059: syntax error : ';' C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\INCLUDE\cstdlib(21) : error C2061: syntax error : identifier 'atexit' C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\INCLUDE\cstdlib(22) : error C2061: syntax error : identifier 'atof' C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\INCLUDE\cstdlib(22) : error C2059: syntax error : ';' C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\INCLUDE\cstdlib(22) : error C2061: syntax error : identifier 'atoi' C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\INCLUDE\cstdlib(22) : error C2061: syntax error : identifier 'atol' C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\INCLUDE\cstdlib(23) : error C2061: syntax error : identifier 'bsearch' C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\INCLUDE\cstdlib(23) : error C2059: syntax error : ';' C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\INCLUDE\cstdlib(23) : error C2061: syntax error : identifier 'calloc' C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\INCLUDE\cstdlib(23) : error C2061: syntax error : identifier 'div' C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\INCLUDE\cstdlib(24) : error C2061: syntax error : identifier 'exit' C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\INCLUDE\cstdlib(24) : error C2059: syntax error : ';' C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\INCLUDE\cstdlib(24) : error C2061: syntax error : identifier 'free' C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\INCLUDE\cstdlib(25) : error C2061: syntax error : identifier 'labs' C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\INCLUDE\cstdlib(25) : error C2059: syntax error : ';' ...
已做过的排查:
- 尝试不同版本的Matlab、Visual Studio及C++编译器,问题均复现
- 原正常代码及MathWorks官方示例代码,只要添加上述头文件就触发错误
- 未修改
mexopts.bat,确认包含目录配置正确 - 在Visual Studio中单独使用这些头文件编译无异常
排查方向提示
- 确认MEX编译语言模式:执行
mex -setup C++确保编译器配置为C模式,而非C模式。若之前用mex -setup C配置过,会导致C语法(如using)被识别为错误。 - 调整头文件包含顺序:确保
mex.h等MEX必备头文件在C++标准库头文件之前包含,避免宏定义冲突导致标准库头文件解析异常。 - 检查编译宏定义:执行
mex -v your_mex_file.cpp查看完整编译命令,检查是否存在强制C语言解析的宏定义(如_STDC_相关宏),如有则移除。 - 强制C++编译参数:编译时添加
/TP参数强制编译器以C++模式处理文件,命令示例:mex -v -compatibleArrayDims /TP your_mex_file.cpp。 - 检查源文件扩展名:确保MEX源文件后缀为
.cpp,而非.c;.c后缀会触发MEX默认用C编译器处理,无法识别C++语法。
内容的提问来源于stack exchange,提问作者Paul Aner
相关产品推荐
相关产品推荐

