如何配置CMake在CLion中编译MEX文件?求助CMakeLists.txt编写方案
我完全懂你的困扰——用MATLAB写C++代码简直是折磨,而切换到CLion这种专业IDE又得搞定MEX编译的配置,尤其是CMake新手很容易摸不着头脑。针对MATLAB R2018b的情况,我给你一套完整的可直接复用的CMake方案,同时拆解关键部分,帮你快速跑起来。
一、直接可用的CMakeLists.txt配置
这是针对你的需求定制的配置,支持C++11新API、兼容旧API,同时解决头文件和无main函数的问题:
cmake_minimum_required(VERSION 3.10) project(MyMexProject) # 强制启用C++11标准,匹配MATLAB R2018b的新API要求 set(CMAKE_CXX_STANDARD 11) set(CMAKE_CXX_STANDARD_REQUIRED ON) # 查找MATLAB环境,关键是指定R2018b的安装路径(如果CMake自动识别失败的话) # Windows路径用双反斜杠,Linux/macOS用正斜杠 find_package(Matlab REQUIRED COMPONENTS MX_LIBRARY MEX_COMPILER PATHS /path/to/your/MATLAB/R2018b # 替换成你的MATLAB实际路径 NO_DEFAULT_PATH) # 生成MEX目标:这里的源文件替换成你自己的MEX代码文件 matlab_add_mex(NAME my_custom_mex SRC your_mex_code.cpp LINK_TO ${Matlab_MX_LIBRARY}) # 定义旧API需要的宏,确保兼容传统mex.h写法 target_compile_definitions(my_custom_mex PRIVATE MATLAB_MEX_FILE)
关键配置解释
find_package(Matlab):CMake的官方模块,会自动识别MATLAB的头文件、库文件和编译工具。如果CMake找不到你的MATLAB,手动在PATHS里填安装路径即可(比如Windows下是C:\\Program Files\\MATLAB\\R2018b,macOS是/Applications/MATLAB_R2018b.app)。matlab_add_mex:专门用于生成MEX文件的CMake命令,它会自动处理MEX的特殊入口(不需要你写main函数),同时链接必要的MATLAB运行时库。target_compile_definitions:定义MATLAB_MEX_FILE宏,这是旧API头文件mex.h需要的,确保编译时能正确识别MEX环境。
二、MEX源文件写法(兼容新/旧API)
下面是一个示例,同时支持MATLAB C++11新API和传统旧API,你可以根据自己的需求调整:
// 仅在MEX编译环境下引入头文件 #ifdef MATLAB_MEX_FILE #include "mex.h" // 旧API头文件 #include "mex.hpp" // 新API基础头文件 #include "mexAdapter.hpp" // 新API适配器头文件 #endif // ------------------- 新API实现(C++11风格)------------------- class MexFunction : public matlab::mex::Function { public: void operator()(matlab::mex::ArgumentList outputs, matlab::mex::ArgumentList inputs) override { // 示例:实现两个数相加 matlab::data::ArrayFactory factory; if (inputs.size() != 2 || outputs.size() != 1) { mexErrMsgTxt("Usage: result = my_custom_mex(a, b)"); } double a = inputs[0][0]; double b = inputs[1][0]; outputs[0] = factory.createScalar<double>(a + b); } }; // ------------------- 旧API实现(可选,兼容传统写法)------------------- #ifdef MATLAB_MEX_FILE void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) { if (nrhs != 2 || nlhs != 1) { mexErrMsgTxt("Usage: result = my_custom_mex(a, b)"); } double a = mxGetScalar(prhs[0]); double b = mxGetScalar(prhs[1]); plhs[0] = mxCreateDoubleScalar(a + b); } #endif
三、CLion中的操作步骤
- 把上面的
CMakeLists.txt和你的MEX源文件放在同一个项目文件夹里,用CLion打开这个文件夹。 - 如果CMake提示找不到MATLAB,检查
find_package里的PATHS路径是否正确,或者在CLion的CMake配置中添加环境变量MATLAB_ROOT,值为你的R2018b安装路径。 - 点击CLion的Build按钮,生成的MEX文件会在
build目录下(比如build/Debug或build/Release,根据你的编译模式)。 - 把生成的MEX文件复制到MATLAB工作目录,或者在MATLAB中用
addpath('你的build目录路径')添加路径,就可以直接调用这个MEX函数了。
四、常见问题解决
- 头文件找不到:
find_package(Matlab)会自动把MATLAB的头文件目录加入编译路径,不需要手动加include_directories,如果还是报错,检查MATLAB路径是否填对。 - 无main函数报错:
matlab_add_mex命令会自动链接MEX的运行时库,提供MEX程序的入口点,CLion不会因为没有main函数报错。 - C++11支持问题:
CMAKE_CXX_STANDARD 11会自动给编译器添加对应选项(Linux/macOS是-std=c++11,Windows是/std:c++11),确保编译器支持C++11特性。
内容的提问来源于stack exchange,提问作者veritas9872




