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

sil*_*ent 14 c c++ resources winapi gcc

我一直在关注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"
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?.

Fré*_*idi 8

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

#include "resource.h"
IDR_MYMENU MENU
BEGIN
.
.
.
END
Run Code Online (Sandbox Code Playgroud)

  • @ sil3nt,没问题.这种事情发生了,你的问题仍然有用. (6认同)

Che*_*tor 7

FFWD 至 2020 年第四季度。在 时代VS Code,很多人在尝试不使用 Visual Studio 来编译 WIN32 GUI“Hello World”时都有些“超越基础”的挣扎。是的,资源文件可能是主要的绊脚石。这是一个更广泛的主题。

由于问题只是关于如何“编译”rc 文件,所以我只回答这个问题。

不知何故,你已经达到了同时拥有my_app.rc和 的地步resource.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
Run Code Online (Sandbox Code Playgroud)

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

编辑

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

my_app.cpp
resource.h
my_app.rc
Run Code Online (Sandbox Code Playgroud)

首先,您需要my_app.res按照上述方式进行制作。其次,在 VS Code 中 .vscode/tasks.json,您将拥有:

cl /Zi /EHsc /Fe:my_app.exe my_app.cpp /link my_app.res
Run Code Online (Sandbox Code Playgroud)

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

  • 最后对资源文件的工作原理进行了简洁而精彩的解释。 (2认同)