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

时间:2010-08-19 22:27:54

标签: 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(但不破坏对Visual Studio的支持)来支持使用资源文件构建Win32应用程序?

1 个答案:

答案 0 :(得分:6)

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

<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

windres man

问题作者

编辑 ...

固定的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)

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