如何通过命令行使用gcc编译win32应用程序时链接.rc(资源)文件?

时间:2010-11-27 11:58:44

标签: c++ c winapi gcc resources

我一直在关注forgers win32教程,特别是this部分,并且想知道如何在编译win32程序时链接.rc(资源)文件? (我正在通过命令行编译)。

我正在阅读this文章,其中说你可以做这样的事情windres chocolate-doom-res.rc chocolate-doom-res.o并以这种方式编译gcc other.o files.o etc.o chocolate-doom-res.o -o chocolate-doom.exe

但是当我尝试windres res.rc res.o(res.rc是我的资源文件)时,它给了我windres: res.rc:3: syntax error

res.rc

#include "resource.h"
IDR_MYMENU
BEGIN
    POPUP "&File"
    BEGIN
        MENUITEM "E&xit", ID_FILE_EXIT
    END

    POPUP "&Stuff"
    BEGIN
        MENUITEM "&Go", ID_STUFF_GO
        MENUITEM "G&o somewhere else",0,GRAYED
    END
END

IDI_MYICON ICON "menu_one.ico"

任何想法?。

2 个答案:

答案 0 :(得分:8)

您错过了MENU资源类型。你应该写:

#include "resource.h"
IDR_MYMENU MENU
BEGIN
.
.
.
END

答案 1 :(得分:1)

FFWD至2020年第四季。在VS Code时代,许多人试图在不使用Visual Studio的情况下编译WIN32 GUI“ Hello World”时都在“超越基础”的范围内苦苦挣扎。是的,资源文件可能是主要的绊脚石。这是一个更广泛的主题。

由于问题仅在于如何“编译” rc文件,所以我只回答一下。

不知何故,您也同时拥有my_app.rcresource.h

  • 为避免造成一些潜在的麻烦,请确保您在#include <windows.h>文件的顶部放置rc
  • 资源编译器称为rc。如果cl.exe在路径上,则rc.exe也在路径上。
  • rcres文件制作二进制rc文件。
  • rc my_app.rc将产生my_app.res
    • 当然,前提是您的rc文件中没有错误。
    • 如果rc找不到windows.h,则可以像这样添加路径 rc /i"C:\Windows Kits\10\Include\10.0.18362.0\um" my_app.rc
    • 使用您的本地路径。
  • 要使用res,在cl命令行上,您需要将res文件传递给链接器,就像这个虚构的示例cl编译命令行上一样
cl /Zi /EHsc /Fe:my_app.exe my_app.cpp /link my_app.res

确保/linkcl命令行的最后一个参数。

编辑

假设您的项目文件夹包含:

my_app.cpp
resource.h
my_app.rc

首先,您将需要如上所述生成my_app.res。 其次,在VS代码.vscode/tasks.json中,您将拥有:

{
    "version": "2.0.0",
    "tasks": [
        {
            "type": "cppbuild",
            "label": "C/C++: cl.exe build active file",
            "command": "cl.exe",
            "args": [
                "/Zi",
                "/EHsc",
                "/Fe:",
                "${fileDirname}\\${fileBasenameNoExtension}.exe",
                "${file}",
                "/link /SUBSYSTEM:WINDOWS ${fileDirname}\\${fileBasenameNoExtension}.res",
            ],
            "options": {
                "cwd": "${workspaceFolder}"
            },
            "problemMatcher": [
                "$msCompile"
            ],
            "group": {
                "kind": "build",
                "isDefault": true
            },
            "detail": "compiler: cl.exe"
        }
    ]
}

请注意,您需要向/link生成的标准任务文件中添加VS Code参数。打开my_app.cpp并执行CTRL+SHIFT+B。这将编译活动文件并将其链接到您的WIN32 App中,其中包括您的资源。