Как добавить значок в скомпилированный исполняемый файл mingw-gcc?

87

Можно ли в Windows, используя gcc mingw, указать, что выходной exe-файл должен принимать файл значка, чтобы exe-файл отображался с этим значком в проводнике?

Михай Лимбэцан
источник

Ответы:

182

Сначала вам нужно создать значок. Затем вам нужно создать RC-файл со следующим содержимым. Здесь мы назовем его my.rc.

id ICON "path/to/my.ico"

idУказано выше в команде может быть в значительной степени все. Это не имеет значения, если вы не хотите ссылаться на него в своем коде. Затем запустите windres следующим образом:

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

Затем при создании исполняемого файла вместе с другими объектными файлами и файлами ресурсов включите их, my.resкоторые мы получили на предыдущем шаге. например:

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

И это должно быть все, что нужно сделать.


И, без дополнительной оплаты, если вы хотите включить информацию о версии в свое приложение, добавьте следующий шаблон в новый .rcфайл и выполните указанные выше действия.

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

Обратите внимание, что langID предназначен для английского языка в Великобритании (который является ближайшей локализацией к Австралии, которую я смог определить). Если вы хотите использовать английский язык в США, измените BLOCK строку на:

BLOCK "040904E4"

и строку перевода на:

VALUE "Translation", 0x409, 1252

См. Информацию на ресурсе VERSIONINFO .

Эван
источник
6
Было бы здорово, если бы на примере было показано, куда вставить строку ICON.
chacham15
И ... во-вторых .. stackoverflow.com/questions/1411040/…
Эрик Фризен
вы также можете включить несколько «Переводов» (это просто говорит Windows, что эта программа переведена), просто добавив WORD, WORD-пары, например: VALUE "Translation", 0x409, 1252, 0x809, 1252включит английский и американский английский в соответствии с msdn.microsoft.com/en-us/ библиотека / aa381058.aspx . Это также говорит вам, что вы можете включить более одного «БЛОКА" lang04E4 "»
WorldSEnder
Я использовал бесплатную утилиту Nirsoft, IconsExtractчтобы встроить значок в нужный файл exe.
Евгений Сергеев
6

В RC-файле nameID даже не обязательно должно быть именем, это может быть просто целое число. Имя файла должно быть заключено в кавычки, только если оно содержит пробел. Вместо того:

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

Ты можешь использовать:

windres my.rc my.o
Стивен Пенни
источник
1
Я не мог связать его my.oс MinGW g++после windres my.rc my.o(какое-то WinMainсообщение об ошибке), но windres my.rc -O coff -o my.resпуть работал нормально.
Евгений Сергеев
.o(= COFF автоматически; я называю это как my.res.oдля ясности) у меня работает. На самом деле .resфайлы, созданные MSVC, имеют другой формат, поэтому он кажется странным / несовместимым с использованием COFF in.res
kxr
1

Попробуйте Resource Hacker. Мне удалось скомпилировать свой проект в Linux (WSL) и создать значок из логотипа на домашней странице. Просто нужен был простой способ встроить его в exe, и эта программа отлично работала. Ресурсный хакер, Ангус Джонсон

noabody
источник
Это было намного проще. Просто открыл .exe, щелкнул «Добавить двоичный или ресурс изображения», открыл ICO-файл и сохранил.
эндолиты