2010-08-19 8 views
12

En teoría, es muy fácil construir una aplicación Win32 con un archivo de recursos usando cmake. En un comando add_executable, un archivo de recursos se puede enumerar tan fácilmente como un archivo fuente C o C++. Sin embargo, existe un error conocido al construir usando herramientas MinGW.¿Cómo construyo una aplicación Win32 con un archivo de recursos usando cmake y MinGW?

He encontrado una solución alternativa, que es incluir lo siguiente en CMakeFiles.txt ...

if(MINGW) 
    set(CMAKE_RC_COMPILER_INIT windres) 
    ENABLE_LANGUAGE(RC) 
    SET(CMAKE_RC_COMPILE_OBJECT 
     "<CMAKE_RC_COMPILER> <FLAGS> <DEFINES> -o <OBJECT> <SOURCE>") 
endif(MINGW) 

Desafortunadamente, esto no parece funcionar. Lo que parece suceder es que windres genera un archivo <whatever>.rc.res que ld no comprende.

En mis búsquedas, he desarrollado una fuerte sospecha de que el soporte de Win32 se considera una prioridad muy baja, especialmente fuera de Visual Studio. Esto es comprensible, ya que Win32 obviamente no es tan importante como lo era antes. Y, por supuesto, Visual Studio Express Editions está disponible de forma gratuita.

Aún así, sería conveniente para mí si pudiera usar MinGW GCC para algunas aplicaciones antiguas de Win32 que aún utilizo. Si nada más, puedo obtener estadísticas de cobertura de prueba GCOV.

Obviamente si todo lo demás falla, siempre podría manejar los archivos de recursos usando un comando de compilación personalizado. Un problema es que no estoy familiarizado con windres o ld, o cómo MinGW está destinado a manejar archivos de recursos de Win32. Otra es que realmente no quiero reinventar la rueda si alguien ya tiene una rueda superior que les gustaría compartir conmigo.

Así que, básicamente, ¿cómo puedo apoyar la construcción de aplicaciones Win32 con archivos de recursos usando cmake y usando MinGW (pero no rompiendo el soporte para Visual Studio)?

Respuesta

6

creo, el problema está aquí:

<CMAKE_RC_COMPILER> <FLAGS> <DEFINES> -o <OBJECT> <SOURCE> 

tal vez debería escribir algo como esto:

<CMAKE_RC_COMPILER> <SOURCE> <OBJECT> 

O más formal:

<CMAKE_RC_COMPILER> -i <SOURCE> -o <OBJECT> 

El otro posible problema podría estar con - ¿qué extensión hace cmake sustitutos? Como Windress adivinará el formato de archivo de salida necesario a partir de eso.

Las referencias están aquí: www.mingw.org/wiki/MS_resource_compiler

"res" archivos son impropio de LD, como ya saben, y el ejemplo windres sourceware.org/binutils/docs/binutils/windres.html

windres hombre

EDITAR por la pregunta autor ...

El fragmento de código de cmake fijo es el siguiente ...

if(MINGW) 
    set(CMAKE_RC_COMPILER_INIT windres) 
    ENABLE_LANGUAGE(RC) 
    SET(CMAKE_RC_COMPILE_OBJECT 
    "<CMAKE_RC_COMPILER> <FLAGS> -O coff <DEFINES> -i <SOURCE> -o <OBJECT>") 
endif(MINGW) 

probablemente debería ser la creación de un Banderas variable en lugar de insertar la opción -O en la plantilla de comandos, pero esto funciona.

+0

Gracias por la respuesta. Estoy ocupado cajero automático, por lo que pueden pasar algunos días antes de que pueda ver esto de nuevo.Una cosa que señalaré fue: intenté decirle a cmake que usara otra extensión. Hay una variable que especifica qué extensión se usa, e intenté cambiarla después del 'enable_language' anterior junto con el compilador which-change. cmake siguió adelante y usó '.res' de todos modos, no sé por qué. De todos modos, +1 porque hay algo útil en este punto, pero puede pasar un tiempo antes de que lo intente. – Steve314

+0

Volví a jugar con esto otra vez, y resulta que el principal problema es que aunque describí esto como un problema de formato de archivo, estaba pensando en primer lugar como un problema de extensión de archivo. La solución fue revisar el manual de los windres y tener el sentido de intentar especificar el formato de salida coff usando '-O coff' independientemente de la extensión de archivo trabajada. Probablemente debería haber averiguado la variable que usa cmake para las banderas de RC, pero después de que la variable de extensión de archivo no funcionó, simplemente inserté la opción en el comando de la plantilla. – Steve314

+0

espero que no te importe que agregue un poco a tu respuesta antes de aceptarla. – Steve314

Cuestiones relacionadas