如何将图标添加到使用mingw-gcc编译的可执行文件中?

104

在Windows系统上,使用mingw的gcc编译器是否有任何方法可以指定输出exe文件的图标文件,以便在资源管理器中显示该图标?

3个回答

214
你需要先创建图标,然后创建一个包含以下内容的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资源以获取更多信息。


13
如果示例能够展示在哪里插入ICON行,那就太好了。 - chacham15
而且...第二...https://dev59.com/kknSa4cB1Zd3GeqPM08t - Erik Friesen
你可以通过添加WORD,WORD-pairs来包含多个“Translations”(这只是告诉Windows该程序已翻译),例如:VALUE "Translation",0x409,1252,0x809,1252将根据http://msdn.microsoft.com/en-us/library/aa381058.aspx启用美式和英式英语。这也告诉您可以包含多个“BLOCK“lang04E4”。 - WorldSEnder
我使用了Nirsoft的免费工具IconsExtract来提取我需要的嵌入在exe文件中的图标。 - Evgeni Sergeev
1
你从哪里获取windres?我已经安装了binutils-mingw-w64-i686,但是找不到windres - endolith

6
在RC文件中,nameID甚至不必是名称,它可以只是一个整数。如果filename包含空格,则必须加引号。而不是:
windres my.rc -O coff -o my.res

您可以使用:

windres my.rc my.o

1
在使用windres my.rc my.o命令后,我无法将my.o与MinGW的g++链接起来(出现了一些与WinMain相关的错误信息),但是使用windres my.rc -O coff -o my.res命令则可以正常工作。 - Evgeni Sergeev
.o (= COFF automatically; I name it like my.res.o for clarity) works for me. Actually .res files as produced by MSVC have a different format, so it seems to be odd/incompatible using COFF in .res - kxr

3
尝试使用资源编辑器。我能够在Linux(WSL)上交叉编译我的项目,并从主页的标志生成一个图标。只需要一种简单的方法将其嵌入exe文件,这个程序非常好用。 资源编辑器(由Angus Johnson开发)

这个简单多了。只需打开.exe文件,点击“添加二进制或图像资源”,打开.ico文件,然后保存即可。 - endolith

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接