如何配置CMake来编译MEX文件?

9
我希望在CLion中编译MEX文件(MATLAB可执行文件),而不是在MATLAB中编译(它对编写C代码没有帮助)。然而,MEX文件需要#include mex.h(pp),这在普通的C++中不可用。此外,格式不同,没有main函数。
我正在使用MATLAB R2018b,并希望使用新的C++ API for MEX-files使用C++11。但是,我也可以使用旧的API。
我已经尝试查看CMake的FindMatlab模块和其他几个位置。然而,大多数其他指南都已过时,甚至它们的参考链接也无法连接到原始页面。
我是CMake的绝对新手,不知道从哪里开始。
我目前无法使用#include "mex.h"#include "mex.hpp"#include "mexAdapter.hpp"等内容。我也无法编译没有main函数的函数。
非常感谢任何能够帮忙上传或描述所需的CMakeLists.txt文件的人。

我不知道CLion是如何工作的,但你能否创建一个“myCompile”关键字来调用MATLAB编译器?我不确定是否可以从外部进行编译。 - Ander Biguri
2
您可以从命令matlab_add_mex开始。在使用它之前,您需要调用find_package(Matlab)。该命令的使用方式与“标准”的add_executableadd_library非常相似。 - Tsyvarev
1个回答

5
编译 MEX-file 时,您的 CMake 文件应包含以下内容:
find_package(Matlab)
matlab_add_mex(NAME mex_file_name SRC source_file.cpp)

mex_file_name 是目标文件的名称,扩展名会自动添加。这是一个普通的目标文件,您可以在该目标上使用 set_target_propertiestarget_compile_definitions 等其他命令。

如果您的 MEX 文件需要链接到库,则在 matlab_add_mex 命令的末尾添加 LINK_TO library

关于使用新的 C++ API:我不记得在调用 matlab_add_mex 时是否必须添加 R2018a 标志。当使用新的 C API(complex interleaved)而不是旧的 C API(separate complex)时,需要此标志。我认为对于 C++ API 不需要,但如果编译出现问题,请添加此标志以查看是否有帮助。


然而,我现在发现出现了许多错误,例如未定义引用`mxGetSingles_800'。我已经尝试在顶部包含matrix.h,即#include "matrix.h",但仍然无法解决问题。 - veritas9872
@veritas9872:请提出一个新的问题,包括一个 [mre]。从您在评论中提供的简短描述中,我无法知道出了什么问题。 - Cris Luengo
1
我在Windows上找不到MATLAB(64位)很困难。显然问题似乎是默认平台设置为x86。将此行添加到我的CMakeLists.txt中 set(CMAKE_GENERATOR_PLATFORM x64) 或在配置时传递相同的定义即可解决。 - Praveen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接