Как использовать CMake и Visual Studio 2010 (64-разрядная версия) для создания MEX-файла MATLAB R2011a (64-разрядная версия)?

Я хотел бы написать CMakeLists.txt, чтобы CMake написал файл решения Visual Studio 2010 (64-разрядный) для создания функции mex для MATLAB R2011a (64-разрядный) из кода С++ example.cxx.

  1. Я не хочу использовать оболочку компилятора MATLAB mex, но настрою файл решения Visual Studio таким образом, чтобы Visual C++ связывал соответствующие библиотеки MATLAB.
  2. example.cxx не имеет никаких зависимостей, кроме библиотек MATLAB, которые необходимы для файлов MEX.
  3. CMake 2.8.7 настроен правильно, так что он использует 64-битный генератор для Visual Studio 2010.

Суть того, чем я сейчас занимаюсь

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

Ни компилятор, ни компоновщик не выдают никаких ошибок. Я устанавливаю вывод example.lib под именем example.mexw64 в каталог по пути MATLAB. Когда я вызываю example из MATLAB, я получаю сообщение об ошибке

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

Любые предложения приветствуются!


person Bernhard Anderson    schedule 18.04.2012    source источник


Ответы (2)


У меня была та же проблема, и эта ссылка оказалась очень полезной (также служит хорошим примером того, как использовать ITK в файле MATLAB MEX, кстати). Я думаю, что в вашем случае вам нужно добавить флаг ссылки "/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 (в этом примере не показано).

person Jer K    schedule 19.06.2012

MEX-файлы Matlab - это dll, а не библиотеки. Попробуйте заставить cmake (не эксперт в этом) создать динамическую библиотеку, а не статическую.

person Tal Darom    schedule 18.04.2012
comment
Я попробовал это. Теперь я получаю сообщение об ошибке: Mex file entry point is missing. Please check the (case-sensitive) spelling of mexFunction (for C MEX-files), or the (case-insensitive) spelling of MEXFUNCTION (for FORTRAN MEX-files). ??? Invalid MEX-file 'C:\...\example.mexw64': C:\...\example.mexw64 is not a valid Win32 application. - person Bernhard Anderson; 19.04.2012
comment
Когда я явно указываю точку входа в файле решения Visual Studio (как заставить CMake делать это независимо от платформы?), я получаю следующее сообщение об ошибке: ??? Invalid MEX-file 'C:\...\example.mexw64': - person Bernhard Anderson; 19.04.2012
comment
ваша dll должна экспортировать функцию mexFunction. Возможно, он не экспортируется или неправильно написан. - person Tal Darom; 19.04.2012