¿Cómo usar CMake y Visual Studio 2010(64 bit) para construir un archivo mex MATLAB R2011a(64 bit)?
visual-c++ 64bit (2)
Me gustaría escribir un CMakeLists.txt
manera que CMake escriba un archivo de solución Visual Studio 2010 (64 bit) para construir una función mex para MATLAB R2011a (64 bit) desde el código C ++ example.cxx
.
- No quiero usar el envoltorio de compilador
mex
MATLAB, pero configuré el archivo de solución de Visual Studio de modo que Visual C ++ vincule las bibliotecas MATLAB relevantes. -
example.cxx
no tiene dependencias, excepto las bibliotecas MATLAB que son necesarias para los archivos mex. - CMake 2.8.7 está configurado correctamente para que utilice el generador de 64 bits para Visual Studio 2010.
La esencia de lo que estoy haciendo ahora mismo es
find_package(Matlab)
add_library(example STATIC example.cxx)
target_link_libraries(example ${MATLAB_LIBRARIES})
Ni el compilador ni el vinculador emiten ningún error. Instalo la salida example.lib
bajo el nombre example.mexw64
en un directorio en la ruta de MATLAB. Cuando llamo al example
de MATLAB, aparece el mensaje de error
??? Invalid MEX-file
''C:/.../example.mexw64'':
C:/.../example.mexw64 is not a valid Win32 application.
Cualquier sugerencia es bienvenida!
Los archivos de Matlab mex son dll`s not libs. Intenta hacer que cmake (no un experto en eso) cree una librart dinámica, no estática.
Tuve el mismo problema y este enlace fue muy útil (también sirve como un buen ejemplo de cómo usar ITK en un archivo MATLAB MEX por cierto). Creo que para su caso, debe agregar el "/export:mexFunction"
enlace "/export:mexFunction"
a su archivo CMakeLists.txt
. Ejemplo a continuación:
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})
Tenga en cuenta que el FIND_PACKAGE(Matlab)
no parece funcionar muy bien, por lo que puede ser un problema para algunas personas. Tuve que solucionarlo codificando las rutas MATLAB en CMakeLists.txt (no se muestra en este ejemplo).