2011-12-12 28 views
7

Actualmente estoy compilando una aplicación MatLab de 32 bits en C++ en una máquina de 64 bits, con MatLab de 64 bits instalado. Sin embargo, tengo todos los archivos DLL y de biblioteca en 32 bits para el motor MatLab. Los archivos de la biblioteca y dll's se cargan correctamente (puedo compilar e iniciar la aplicación sin ningún error que pueda obtener cuando uso los dll/libs de 64 bits), pero parece que los dll de 32 bits ejecutan el ejecutable de matlab de 64 bits, entonces mi programa falla tan pronto como trato de hacer algo con el motor. ¿Hay alguna manera en que pueda hacer que mi aplicación ejecute el ejecutable de matlab de 32 bits en lugar del de 32 bits?Compilación de la aplicación matlab de 32 bits en la máquina de 64 bits (C++)

¡Gracias de antemano!

Respuesta

9

Es posible, pero es extremadamente desordenado: todo el sistema mbuild/deploytool es una pieza de cr * p en mi opinión. El primer problema con deploytool.bat es que, aunque tiene una opción '-win32', eso no tiene ningún efecto cuando deploytool no se invoca desde el directorio de instalación de 32 bits. El segundo problema es que las opciones de mbuild se comparten para versiones de 32 y 64 bits, por lo que deben especificarse manualmente ya que de lo contrario se utilizan las opciones de compilación incorrectas.

Aquí hay algunas cosas que hice para compilar tanto 32 bits como 64 bits desde una máquina de Windows de 64 bits con VS2010 instalado.

  • usted tiene que instalar las dos versiones de MATLAB 32 y 64 bits
  • Vas a tener que hacer todo, desde la línea de comandos
  • nunca puede editar sus archivos a través de la interfaz de usuario .PRJ deploytool porque los tornillos de seguridad de todos cambios manuales hechos a ellos. (bueno, eso es realmente un beneficio ya que ahora al menos podrás almacenarlos en un VCS)
  • apunta a las opciones correctas del compilador agregando <param.c.cpp.options.file> al prj en la sección 'configuración' (ver abajo)
  • construido por manully dar la ruta completa a la deploytool.bat de la instalación de 32 bits

archivo de opciones de configuración en PRJ:

<deployment-project> 
    <configuration ....> 
    .... 
    <param.c.cpp.options.file>${MATLAB_ROOT}\bin\win32\mbuildopts\msvc100compp.bat</param.c.cpp.options.file> 
    .... 

Tenga en cuenta que la salida dir etc será el mismo para el de 32 bits y versiones de 64 bits. En la práctica, si tiene que hacer esto para múltiples proyectos, esto se vuelve totalmente inmanejable. Así que tengo una secuencia de comandos msbuild para facilitar la vida: básicamente en el archivo prj, reemplace todo lo dependiente de la plataforma (dir de salida, directorio raíz de matlab, ubicación del archivo de opciones) por macros, luego dejo que msbuild copie el prj y realice una búsqueda/reemplazo de expresiones regulares las macros con valores dependiendo de la plataforma. Esto permite usar el mismo prj para ambas plataformas.

actualización

Después de algunos cambios importantes en nuestros proyectos hemos encontrado que con el tiempo la molestia de tratar con los archivos PRJ MATLAB no valía la pena. En cambio, simplificamos enormemente todo al invocar mcc directamente y alimentarlo con todos los archivos que pertenecen a un proyecto.Aquí está el código msbuild relevante; algunos de comprobación de errores omite para mayor claridad:

<Target Name="BuildMatlabProject"> 
    <PropertyGroup Condition="$(MlPlatform)=='x86'"> 
    <MlMatlabBinDir>$(MlMatlabx86Dir)\bin\win32</MlMatlabBinDir> 
    </PropertyGroup> 
    <PropertyGroup Condition="$(MlPlatform)=='x64'"> 
    <MlMatlabBinDir>$(MlMatlabx64Dir)\bin\win64</MlMatlabBinDir> 
    </PropertyGroup> 
    <ItemGroup> 
    <MlMFiles Include="$(MlMatlabProjDir)\*.m"/> 
    <MlMResources Include="$([System.IO.Directory]::GetDirectories(&quot;$(MlMatlabSrcDir)&quot;))"/> 
    </ItemGroup> 
    <PropertyGroup> 
    <MlMresourcseString Condition="@(MlMResources)!=''"> -a @(MlMResources, ' -a ')</MlMresourcseString> 
    </PropertyGroup> 
    <RemoveDir Directories="$(MlOutDir)" ContinueOnError="true"/> 
    <MakeDir Directories="$(MlOutDir)"/> 
    <Exec Command="$(MlMatlabBinDir)\mcc -W cpplib:$(MlOutputName)_$(MlPlatform) 
-T link:lib -d $(MlOutDir) -f $(MlMatlabBinDir)\mbuildopts\msvc100compp.bat 
-w enable:specified_file_mismatch -w enable:repeated_file -w enable:switch_ignored 
-w enable:missing_lib_sentinel -w enable:demo_license -v 
@(MlMFiles, ' ') $(MlMresourcseString)"/> 
</Target> 

Se necesita estas propiedades:

  • MlPlatform: x86 para construir 32 bits, x64 para construir 64 bits
  • MlMatlabx86Dir: camino a MATLAB 32bit directorio instalación
  • MlMatlabx64Dir: ruta 64 bits MATLAB directorio instalación
  • MlMatlabProjDir: dir camino hacia la 'proyecto' con m-archivos para compilar
  • MlMatlabSrcDir: camino de fuente extra con archivos-m
  • MlOutDir: directorio de salida
  • MlOutputName: nombre de salida
+1

Wow ... Gracias por su respuesta. Creo que voy a desinstalar MatLab de 64 bits e instalar 32 bits. Realmente no necesito exportar a 64 bits, solo esperaba que hubiera una forma fácil de compilar a 32 bits sin tener que instalar MatLab de 32 bits. Por cierto, no estoy usando el deploytool de forma manual. Solo dejo que vs2010 compile todo por mí. – Tiddo

+1

Acabo de leer su respuesta un poco mejor, pero todavía no entiendo por qué mi programa no funciona: no uso ninguna herramienta de compilación de matlab, simplemente incluyo y enlazo a las bibliotecas y dll, por lo que mi programa puede usa el motor Por lo que puedo entender, deploytool es simplemente una herramienta que compila un programa con la configuración correcta para los archivos MEX. Sin embargo, no construyo un archivo MEX, y configuro manualmente las configuraciones que necesito. Pero de alguna manera tiene que ser posible establecer la configuración de tal manera que PUEDA exportar a 32 bits sin tener que instalar una versión de 32 bits, ¿verdad? – Tiddo

+1

@Tiddo ¿qué libs usas? En mi instalación de 64 bits, solo hay librerías de 64 bits en extern/lib/win64, por lo que no pueden usarse para construir una versión de 32 bits – stijn

Cuestiones relacionadas