Windows EXE 圖標存儲在 PE 文件資源段 中,通過資源腳本 編譯鏈接進可執行文件。
ImageMagick convert、在線轉換器、專業圖標編輯器resource.rc
// resource.rc
#include
#define IDI_MAIN_ICON 101
IDI_MAIN_ICON ICON "app.ico"
| 編譯器 | 命令/配置 |
|---|---|
| MSVC (cl.exe) | rc resource.rc 生成 resource.res,鏈接時 resource.res |
| MinGW (gcc) | windres resource.rc -O coff -o resource.o,編譯時 resource.o |
| CMake | set(CMAKE_RC_COMPILER windres) + add_executable(app main.c resource.rc) |
| Visual Studio | 專案 → 右鍵 → Add → Resource → Icon → 設置 ID |
| Code::Blocks | Project → Properties → Resources → Add .rc 文件 |
resource.h、.rc,分配 ID(如 IDI_ICON1)
// 查看 EXE 資源
// 命令行
dumpbin /resources app.exe
// 圖形化工具
// Resource Hacker、PE Explorer、Visual Studio 打開 EXE
| 問題 | 原因 | 解決 |
|---|---|---|
| 圖標不顯示 | .ico 格式不符/尺寸缺失 | 確保包含 16/32/48/256 尺寸 |
| 資源編譯失敗 | 路徑含中文/空格 | 路徑純 ASCII,無空格 |
| 多圖標顯示錯誤 | ID 衝突/順序錯誤 | 主圖標 ID 最小(如 101),系統取最小 ID |
| 修改後不生效 | 系統圖標緩存 | 重建圖標緩存:ie4uinit.exe -show 或重啟資源管理器 |
// resource.rc 完整示例
#include
#define VER_FILEVERSION 1,0,0,0
#define VER_FILEVERSION_STR "1.0.0.0\0"
VS_VERSION_INFO VERSIONINFO
FILEVERSION VER_FILEVERSION
PRODUCTVERSION VER_FILEVERSION
FILEFLAGSMASK 0x3fL
FILEFLAGS 0
FILEOS VOS_NT_WINDOWS32
FILETYPE VFT_APP
FILESUBTYPE VFT2_UNKNOWN
BEGIN
BLOCK "StringFileInfo"
BEGIN
BLOCK "040904b0"
BEGIN
VALUE "CompanyName", "MyCompany\0"
VALUE "FileDescription", "My Application\0"
VALUE "FileVersion", VER_FILEVERSION_STR
VALUE "InternalName", "MyApp\0"
VALUE "OriginalFilename", "MyApp.exe\0"
VALUE "ProductName", "MyProduct\0"
VALUE "ProductVersion", VER_FILEVERSION_STR
END
END
BLOCK "VarFileInfo"
BEGIN
VALUE "Translation", 0x409, 1200
END
END
// 圖標
#define IDI_MAIN_ICON 101
IDI_MAIN_ICON ICON "app.ico"
EXE 圖標設置本質是資源編譯鏈接。現代 IDE(VS、CLion、VS Code + CMake)均圖形化/配置化支持,核心步驟:準備多尺寸 .ico → 編寫 .rc 腳本 → 納入構建系統 → 鏈接生成 EXE。避免「生成後修改」(工具不可靠、簽名失效),採用構建時集成,一勞永逸。