因此,我正在使用C和Win32 API制作一个桌面应用程序。我还与MinGW一起使用CMake/Make。一切进展顺利,直到我想要向可执行文件中添加一个.rc文件。据我所知,您编写了一个.rc文件,然后编译成一个.res文件,然后假定您应该将它嵌入到可执行文件中。但是,当我尝试用GNU实用程序编译.rc文件时,它无法编译,这就是问题所在。我总是收到以下错误消息:
C:\ProgramData\chocolatey\lib\mingw\tools\install\mingw64\bin\windres.exe: can't open file `page:': Invalid argument
C:\Code\C\test\resources.rc:4: fatal error: when writing output to : No such file or directory
4 | IDI_TEST_ICON ICON "test.ico"
|
compilation terminated.
C:\ProgramData\chocolatey\lib\mingw\tools\install\mingw64\bin\windres.exe: preprocessing failed.为了完整起见,我尝试过的每个.rc文件都会出现这种情况,但是,下面是我要编译的当前测试文件:
#include <windows.h>
#include "resource.h"
IDI_TEST_ICON ICON "test.ico"和resource.h文件:
#define IDI_TEST_ICON 101因此,最后一个问题是:为什么windres不成功编译.rc文件?在使用MinGW时,我能做些什么呢?
编辑1:值得注意的是,我还将.rc文件转换为ANSI格式,因为在UTF-8格式格式化时,windres会产生奇怪的错误。然而,同样的错误也会发生。
发布于 2022-06-22 13:41:08
经过大量的挖掘旧的论坛线程,我设法找到了一个“解决方案”的工作。然而,我仍然觉得奇怪的是,这解决了这个问题。我遵循Brecht的建议,并从winlibs.com下载了一个独立的构建。即使这样也没有解决导致我调查可能的RC_COMPILER_FLAGS的问题,这最终导致我找到了--use-temp-file标志。
此标志作为编译.rc文件的另一种方法,因为它不允许使用popen (或在Windows中与之等效)。根据文档,如果popen在主机上的实现是错误的,则应该使用此标志。这里有趣的是,文档指出,这是已知发生在某些非英语版本的Windows。在我的例子中,我使用的是瑞典语版本的Windows,这可能解释了为什么会出现这种情况。
因此,最终的解决办法是:
windres -i resource.rc -o resource.o --use-temp-file它最终生成一个对象文件,然后该文件可以包含在add_executable调用中的CMake中。
发布于 2022-06-21 07:57:40
windres实际上生成一个对象文件(以COFF格式)
所以您应该像这样运行这个命令:
windres resource.rc -o resource.o当我检查生成文件的格式时,如下所示:
file resource.o我得到以下结果:
resource.o: Intel amd64 COFF object file, no line number info, not stripped, 1 section, symbol offset=0x3c4c, 1 symbols因此,您只需要在链接步骤中包含生成的.o文件,就可以包含资源。
例如,当您运行以下命令时,您将得到一个不会运行的.exe,但它将在资源管理器中显示该图标:
gcc -shared -o resource.exe resource.ohttps://stackoverflow.com/questions/72691457
复制相似问题