winapi - 如何使用 cmake 和 MinGW 使用资源文件构建 Win32 应用程序?

标签 winapi mingw cmake resource-files

理论上,使用 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生成 <whatever>.rc.res文件其中 ld不明白。

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

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

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

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

最佳答案

我想,你的问题在这里:

<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代码片段如下...
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命令模板中的选项,但这有效。

关于winapi - 如何使用 cmake 和 MinGW 使用资源文件构建 Win32 应用程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3526794/

相关文章:

c++ - 是否有 Windows API 来自动设置 16 字节数组?

c++ - 在 C++ WINAPI 中对 EDIT 控件进行子类化时窗口为空

c++ - 有没有办法在 MinGW 中控制所有三个子应用程序管道,即 STDOUT、STDIN 和 STDERR?

c++ - 使用 SDL 项目调试错误 "no source available for main()"

c++ - 警告已弃用的从字符串常量到 char * 的转换

cmake - 找不到 CMAKE_CUDA_COMPILER

mfc - 在创建时更改对话框的样式以覆盖 .RC 模板中的内容

windows - ALT KEY 的虚拟键码

c++ - 如何使用地址模型标志在 Windows 上为 Visual Studio 构建 64 位 boost?

makefile - 使 'make clean' 请求确认