¿Cómo agrego un icono a un ejecutable compilado de mingw-gcc?

86

En Windows, usando gcc de mingw, ¿hay alguna forma de especificar que el archivo exe de salida debe tomar un archivo de icono, de modo que el archivo exe se muestre con ese icono en el explorador?

Mihai Limbășan
fuente

Respuestas:

181

Primero debes crear el ícono. Luego, debe crear un archivo RC con el contenido a continuación. Aquí lo nombraremos como my.rc.

id ICON "path/to/my.ico"

Lo idmencionado en el comando anterior puede ser prácticamente cualquier cosa. No importa a menos que quieras hacer referencia a él en tu código. Luego ejecute windres de la siguiente manera:

windres my.rc -O coff -o my.res

Luego, mientras compila el ejecutable, junto con otros archivos de objetos y archivos de recursos, incluya los my.resque obtuvimos en el paso anterior. p.ej:

g++ -o my_app obj1.o obj2.o res1.res my.res

Y eso debería ser todo lo que hay que hacer.


Y, sin cargo adicional, si desea incluir información de la versión en su aplicación, agregue el siguiente texto estándar a un nuevo .rcarchivo y siga los pasos mencionados anteriormente.

1 VERSIONINFO
FILEVERSION     1,0,0,0
PRODUCTVERSION  1,0,0,0
BEGIN
  BLOCK "StringFileInfo"
  BEGIN
    BLOCK "080904E4"
    BEGIN
      VALUE "CompanyName", "My Company Name"
      VALUE "FileDescription", "My excellent application"
      VALUE "FileVersion", "1.0"
      VALUE "InternalName", "my_app"
      VALUE "LegalCopyright", "My Name"
      VALUE "OriginalFilename", "my_app.exe"
      VALUE "ProductName", "My App"
      VALUE "ProductVersion", "1.0"
    END
  END
  BLOCK "VarFileInfo"
  BEGIN
    VALUE "Translation", 0x809, 1252
  END
END

Tenga en cuenta que langID es para inglés del Reino Unido (que es la localización más cercana a Australia que pude identificar). Si desea "inglés" de EE. UU., Cambie la BLOCK línea a:

BLOCK "040904E4"

y la línea de traducción a:

VALUE "Translation", 0x409, 1252

Consulte el recurso VERSIONINFO para obtener información.

Evan
fuente
6
Sería genial si el ejemplo mostrara dónde insertar la línea ICON.
chacham15
Y ... en segundo lugar ... stackoverflow.com/questions/1411040/…
Erik Friesen
también puede incluir múltiples "Traducciones" (solo le dice a Windows que este programa está traducido) simplemente agregando WORD, WORD-pair, por ejemplo: VALUE "Translation", 0x409, 1252, 0x809, 1252habilitaría tanto el inglés de EE. UU. como el del Reino Unido de acuerdo con msdn.microsoft.com/en-us/ biblioteca / aa381058.aspx . Esto también le indica que puede incluir más de un 'BLOQUE "lang04E4"'
WorldSEnder
Usé la utilidad gratuita de Nirsoft IconsExtractpara incrustar un ícono en el exeque necesitaba.
Evgeni Sergeev
6

En el archivo RC, el nameID ni siquiera tiene que ser un nombre, solo puede ser un número entero. El nombre del archivo debe citarse solo si contiene un espacio. En vez de:

windres my.rc -O coff -o my.res

Puedes usar:

windres my.rc my.o
Steven Penny
fuente
1
No pude vincular el my.ocon MinGW g++después windres my.rc my.o(algún WinMainmensaje de error relacionado), pero la windres my.rc -O coff -o my.resruta funcionó bien.
Evgeni Sergeev
.o(= COFF automáticamente; lo nombro como my.res.opara mayor claridad) funciona para mí. En realidad, los .resarchivos producidos por MSVC tienen un formato diferente, por lo que parece ser extraño / incompatible con COFF en.res
kxr
1

Prueba Resource Hacker. Pude realizar una compilación cruzada de mi proyecto en Linux (WSL) y generar un icono a partir del logotipo de la página de inicio. Solo necesitaba una forma sencilla de incrustarlo en el exe y este programa funcionó muy bien. Hacker de recursos de Angus Johnson

nadie
fuente
Esto fue mucho más fácil. Simplemente abrió el .exe, hizo clic en "Agregar recurso binario o de imagen", abrió el archivo .ico y guardó.
endolito