2

我想写一个CMakeLists.txt这样的 CMake 编写一个 Visual Studio 2010 (64 bit) 解决方案文件来从 C++ 代码为 MATLAB R2011a (64 bit) 构建一个 mex 函数example.cxx

  1. 我不想使用 MATLAB 的编译器包装器mex,而是设置 Visual Studio 解决方案文件,以便 Visual C++ 链接相关的 MATLAB 库。
  2. example.cxx除了 mex 文件所需的 MATLAB 库之外,没有其他依赖项。
  3. CMake 2.8.7 设置正确,因此它使用 Visual Studio 2010 的 64 位生成器。

我现在做的事情的本质是

find_package(Matlab)
add_library(example STATIC example.cxx)
target_link_libraries(example ${MATLAB_LIBRARIES})

编译器和链接器都不会发出任何错误。我将输出安装在 MATLAB 路径中的目录中example.lib的名称下。example.mexw64当我example从 MATLAB 调用时,我收到错误消息

??? Invalid MEX-file
'C:\...\example.mexw64':
C:\...\example.mexw64 is not a valid Win32 application.

欢迎任何建议!

4

2 回答 2

3

我遇到了同样的问题,这个链接非常有帮助(顺便说一句,它也是如何在 MATLAB MEX 文件中使用ITK的一个很好的例子)。我认为对于您的情况,您需要将链接标志添加"/export:mexFunction"到您的CMakeLists.txt文件中。下面的例子:

PROJECT(example)
FIND_PACKAGE(Matlab REQUIRED)

INCLUDE_DIRECTORIES(${MATLAB_INCLUDE_DIR})

ADD_LIBRARY(example MODULE example.cpp)
ADD_DEFINITIONS(-DMATLAB_MEX_FILE)

# Needed for entry point.
SET_TARGET_PROPERTIES(example
PROPERTIES
LINK_FLAGS "/export:mexFunction"
)

# Change the dll extension to a mex extension.
set_target_properties(example PROPERTIES SUFFIX ".mexw64")

TARGET_LINK_LIBRARIES(example ${MATLAB_LIBRARIES})

请注意,这FIND_PACKAGE(Matlab)似乎并没有那么好用,所以这对某些人来说可能是个问题。我不得不通过将 MATLAB 路径硬编码到 CMakeLists.txt 中来解决这个问题(本示例中未显示)。

于 2012-06-19T05:57:39.970 回答
0

Matlab mex 文件是 dll 不是库。尝试让 cmake(不是这方面的专家)创建一个动态的库,而不是静态的。

于 2012-04-18T22:10:40.667 回答