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

18
我一直在跟随 forgers win32 的教程,具体来说是这个部分,我想知道如何在编译win32程序时链接.rc(资源)文件?(我是通过命令行进行编译的)。
我正在阅读这篇文章,其中提到可以这样做: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"
任何想法?

你可能刚刚为我节省了数小时的时间!感谢你的文章! - GRASBOCK
2个回答

10

你缺少了MENU资源类型。你应该写成:

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

6
@sil3nt,没问题。那种事情时有发生,你的问题仍然是有用的。 - Frédéric Hamidi

6

跳到2020年第四季度,在 VS Code 时代,很多人在尝试编译WIN32 GUI“Hello World”时遇到了一些“基础以外”的困难,而不使用Visual Studio。是的,资源文件可能是主要障碍。那是一个更广泛的主题。

既然问题只涉及如何“编译进”rc文件,让我只回答这个问题。

不知怎么的,你也有了my_app.rcresource.h

  • 为避免一些潜在的大麻烦,请确保在rc文件顶部包含#include <windows.h>
  • 资源编译器称为rc。如果cl.exe在路径上,rc.exe也在路径上。
  • rcrc文件生成二进制res文件。
  • 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,必须将res文件传递给链接器,在此虚构的cl编译命令行上,如下所示
cl /Zi /EHsc /Fe:my_app.exe my_app.cpp /link my_app.res

确保/link是您cl命令行的最后一个参数。

编辑

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

my_app.cpp
resource.h
my_app.rc

首先,按照上述方法需要生成my_app.res文件。 其次,在VS Code .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"
        }
    ]
}

注意,在通过 VS Code 生成标准任务文件时,需要添加 /link 参数。打开 my_app.cpp 并执行 CTRL+SHIFT+B。这将编译并链接当前活动文件到您的 WIN32 应用程序,并包括您的资源。


1
终于有一个简明扼要且精彩的解释,说明了资源文件是如何工作的。 - TCB13
感谢 @TCB13。以这种方式理解WIN32资源可能会极大地提高一个人的优势。 - Chef Gladiator

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