【问题标题】:How do I build a Win32 app with a resource file using cmake and MinGW?如何使用 cmake 和 MinGW 构建带有资源文件的 Win32 应用程序?
【发布时间】:2011-04-01 09:44:17
【问题描述】:

理论上,使用 cmake 构建带有资源文件的 Win32 应用程序非常容易。在add_executable 命令中,可以像列出 C 或 C++ 源文件一样轻松地列出资源文件。但是,在使用 MinGW 工具进行构建时存在一个已知错误。

我找到了一种解决方法,即在 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)

不幸的是,这似乎不起作用。似乎发生的事情是windres 生成了一个&lt;whatever&gt;.rc.res 文件,ld 不理解。

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

即便如此,如果我可以将 MinGW GCC 用于一些我仍在使用的旧 Win32 应用程序,那对我来说会很方便。如果不出意外,我可以获得 GCOV 测试覆盖率统计信息。

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

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

【问题讨论】:

  • 看来 cmake 错误 (cmake.org/Bug/view.php?id=4068) 已修复为 cmale 2.8.5。 2.8.12 是最古老的仍在使用的版本,因此现在不需要解决任何问题。

标签: winapi mingw cmake resource-files


【解决方案1】:

我想,你的问题就在这里:

<CMAKE_RC_COMPILER> <FLAGS> <DEFINES> -o <OBJECT> <SOURCE>

也许你应该这样写:

<CMAKE_RC_COMPILER> <SOURCE> <OBJECT>

或更正式的:

<CMAKE_RC_COMPILER> -i <SOURCE> -o <OBJECT>

另一个可能的问题可能是 - cmake 替代了哪个扩展?因为windress会从中猜测出所需的输出文件格式。

参考文献在这里: www.mingw.org/wiki/MS_resource_compiler

"res" 文件不适合 ld,正如您已经知道的,以及 windres 示例 sourceware.org/binutils/docs/binutils/windres.html

温德斯人

编辑由问题作者...

固定cmake代码sn -p如下...

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)

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

【讨论】:

  • 感谢您的回答。我正忙着提款机,所以可能要过几天才能再次查看。我要指出的一件事 - 我试图告诉 cmake 使用另一个扩展。有一个变量指定使用哪个扩展名,我尝试在上面的 enable_language 以及 which-compiler 更改之后更改它。 cmake 继续使用 .res 无论如何 - 不知道为什么。无论如何,+1 因为目前有任何帮助,但我可能需要一段时间才能尝试。
  • 我有时间再次玩这个,结果发现主要问题是虽然我将其描述为文件格式问题,但我首先/最重要的是认为它是文件扩展名问题.解决方案是重新访问 windres 手册,并尝试使用 -O coff 指定 coff 输出格式,而不管文件扩展名如何。我可能应该知道 cmake 用于 RC 标志的变量,但是在文件扩展名变量不起作用后,我只是将选项插入到模板命令中。
  • 希望你不介意我在接受之前给你的答案添加一点。
  • -O coff 我没有告诉你,因为它是写在windres手册中的,我指出,认为这就足够了,但问题还是解决了:)
  • 直到我删除了CMAKE_RC_COMPILE_OBJECT 命令的&lt;FLAGS&gt; 部分,这个解决方案才对我有用; windres 抱怨未知标志--L。希望这会有所帮助。
猜你喜欢
  • 2021-12-01
  • 1970-01-01
  • 2013-12-01
  • 2015-06-10
  • 2012-11-04
  • 1970-01-01
  • 2011-04-15
  • 2020-03-01
  • 1970-01-01
相关资源
最近更新 更多