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

Ste*_*314 12 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)
Run Code Online (Sandbox Code Playgroud)

不幸的是,这似乎不起作用.似乎发生的是windres生成一个不理解的<whatever>.rc.res文件ld.

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

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

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

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

PF4*_*lic 6

我想,你的问题在这里:

<CMAKE_RC_COMPILER> <FLAGS> <DEFINES> -o <OBJECT> <SOURCE>
Run Code Online (Sandbox Code Playgroud)

也许你应该写这样的东西:

<CMAKE_RC_COMPILER> <SOURCE> <OBJECT>
Run Code Online (Sandbox Code Playgroud)

或者更正式:

<CMAKE_RC_COMPILER> -i <SOURCE> -o <OBJECT>
Run Code Online (Sandbox Code Playgroud)

另一个可能的问题可能是 - 哪个扩展名为cmake替代品?因为windress将猜测所需的输出文件格式.

参考文献如下: www.mingw.org/wiki/MS_resource_compiler

正如您所知,"res"文件对于ld是不合适的,并且windres示例 sourceware.org/binutils/docs/binutils/windres.html

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)
Run Code Online (Sandbox Code Playgroud)

它可能应该是设置标志变量而不是-O在命令模板中插入选项,但这是有效的.