Winapi 如何使用cmake和MinGW构建具有资源文件的Win32应用程序?

Winapi 如何使用cmake和MinGW构建具有资源文件的Win32应用程序?,winapi,mingw,cmake,resource-files,Winapi,Mingw,Cmake,Resource Files,理论上,使用cmake构建带有资源文件的Win32应用程序非常容易。在 AddieExtReabtuaby命令中,资源文件可以容易地被列为C或C++源文件。然而,当使用MinGW工具构建时,存在一个已知的bug 我找到了一个解决方法,在CMakeFiles.txt中包含以下内容 if(MINGW) set(CMAKE_RC_COMPILER_INIT windres) ENABLE_LANGUAGE(RC) SET(CMAKE_RC_COMPILE_OBJECT "<

理论上,使用cmake构建带有资源文件的Win32应用程序非常容易。在<代码> AddieExtReabtuaby<代码>命令中,资源文件可以容易地被列为C或C++源文件。然而,当使用MinGW工具构建时,存在一个已知的bug

我找到了一个解决方法,在CMakeFiles.txt中包含以下内容

if(MINGW)
  set(CMAKE_RC_COMPILER_INIT windres)
  ENABLE_LANGUAGE(RC)
  SET(CMAKE_RC_COMPILE_OBJECT
      "<CMAKE_RC_COMPILER> <FLAGS> <DEFINES> -o <OBJECT> <SOURCE>")
endif(MINGW)
if(MINGW)
集合(CMAKE\u RC\u编译器\u INIT windres)
启用语言(RC)
SET(CMAKE\u RC\u COMPILE\u对象
“-o”)
endif(MINGW)
不幸的是,这似乎不起作用。似乎发生的情况是,
windres
生成了一个
.rc.res
文件,而
ld
无法理解该文件

在我的搜索中,我强烈怀疑Win32支持被视为一个非常低的优先级,特别是在VisualStudio之外。这是可以理解的,因为Win32显然不像以前那么重要了。当然,VisualStudioExpress版也很容易免费获得

即便如此,如果我能将MingWGCC用于一些我仍然使用的旧Win32应用程序,对我来说还是很方便的。如果没有别的,我可以得到GCOV测试覆盖率统计数据

显然,如果所有其他方法都失败了,我总是可以使用自定义构建命令来处理资源文件。一个问题是我不熟悉windres或ld,也不熟悉MinGW如何处理Win32资源文件。另一个原因是,如果有人已经有了一个他们想与我分享的高级轮子,我真的不想重新发明轮子


基本上就是这样-我如何支持使用cmake和MinGW构建包含资源文件的Win32应用程序(但不破坏对Visual Studio的支持)?

我认为,您的问题在于:

<CMAKE_RC_COMPILER> <FLAGS> <DEFINES> -o <OBJECT> <SOURCE>
-o
也许你应该这样写:

<CMAKE_RC_COMPILER> <SOURCE> <OBJECT>

或更正式:

<CMAKE_RC_COMPILER> -i <SOURCE> -o <OBJECT>
-i-o
另一个可能的问题是——cmake替代了哪个扩展?因为windress会从中猜出所需的输出文件格式

参考资料如下:

正如您已经知道的,“res”文件不适合ld,windres示例

温德尔人

按问题作者编辑

固定的cmake代码片段如下所示

if(MINGW)
  set(CMAKE_RC_COMPILER_INIT windres)
  ENABLE_LANGUAGE(RC)
  SET(CMAKE_RC_COMPILE_OBJECT
    "<CMAKE_RC_COMPILER> <FLAGS> -O coff <DEFINES> -i <SOURCE> -o <OBJECT>")
endif(MINGW)
if(MINGW)
集合(CMAKE\u RC\u编译器\u INIT windres)
启用语言(RC)
SET(CMAKE\u RC\u COMPILE\u对象
“-O coff-i-O”)
endif(MINGW)

它可能应该设置一个flags变量,而不是在命令模板中插入
-O
选项,但这是可行的。

谢谢您的回答。我在忙自动取款机,所以可能要过几天我才能再研究一下。我要指出的一点是,我试图告诉cmake使用另一个扩展。有一个变量指定使用哪个扩展,我尝试在上面的
enable\u语言
之后更改该变量,同时更改编译器。cmake继续使用
.res
无论如何-不知道为什么。不管怎么说,+1因为在这一点上任何东西都是有用的,但是在我尝试它之前可能需要一段时间。我有时间再次使用它,结果发现主要的问题是,尽管我把它描述为一个文件格式问题,但我认为它首先是一个文件扩展名问题。解决方案是重新阅读windres手册,并尝试使用
-O coff
指定coff输出格式,而不管文件扩展名如何。我本应该知道cmake用于RC标志的变量,但在文件扩展名变量不起作用后,我只是将该选项插入到模板命令中。希望您不介意我在接受之前在您的答案中添加一点。-O coff我没有告诉您,因为它是在windres手册中编写的,我指出,我想这就足够了,但问题还是解决了:)直到我删除了
CMAKE\u RC\u COMPILE\u对象的
部分,这个解决方案才对我起作用;windres抱怨一个未知的标志
--L
。希望这能有所帮助。看起来cmake bug()已修复为cmale 2.8.5。2.8.12是目前仍普遍使用的最老版本,因此现在无需进行任何变通。