簡體   English   中英

無論我做什么,Windres 都不會編譯 .rc 文件

[英]Windres not compiling .rc file no matter what I do

所以我正在使用 C 和 Win32 API 制作一個桌面應用程序。 我還將 CMake/Make 與 MinGW 結合使用。 一切都很順利,直到我想將 .rc 文件添加到可執行文件中。 據我了解,您編寫了一個 .rc 文件,然后將其編譯為 .res 文件,然后大概您應該將其嵌入可執行文件中。 然而,這是問題所在,當我嘗試使用 GNU 實用程序windres編譯 .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 格式,因為 windres 在以 UTF-8 格式化時會產生特殊錯誤而臭名昭著。 然而,同樣的錯誤也會發生。

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.o

經過大量挖掘舊論壇主題后,我設法找到了一個有效的“解決方案”。 但是我仍然覺得這解決了這個問題很奇怪。 我聽從了 Brecht Sanders 的建議,從winlibs.com下載了一個獨立版本。 即使這樣也沒有解決導致我調查可能的 RC_COMPILER_FLAGS 最終導致我使用--use-temp-file標志的問題。

此標志充當編譯.rc文件的替代方法,因為它排除了popen的使用(或在 Windows 中的等效項)。 根據文檔,如果popen的實現在主機上有問題,則應使用此標志。 這里有趣的是,文檔指出這會發生在某些非英語版本的 Windows 上。 就我而言,我使用的是瑞典語版本的 Windows,這可以解釋為什么會發生這種情況。

因此最終的解決方案是:

windres -i resource.rc -o resource.o --use-temp-file

最終產生一個目標文件,然后可以將其包含在 CMake 中的add_executable調用中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM