2010-08-19 76 views
12

从理论上讲,使用cmake构建带有资源文件的Win32应用程序非常简单。在add_executable命令中,资源文件可以像C或C++源文件一样轻松列出。但是,使用MinGW工具构建时存在已知的错误。如何使用cmake和MinGW使用资源文件构建Win32应用程序?

我发现了一个解决办法,这是包括在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支持使用资源文件构建Win32应用程序,并使用MinGW(但不打破对Visual Studio的支持)?

回答

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

“资源” 文件unappropriate为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) 

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

+0

感谢您的回答。我忙于ATM,因此可能需要几天时间才能再次查看。我会指出的一件事 - 我试图告诉cmake使用另一个扩展。有一个变量指定使用哪个扩展,我试着在上面的'enable_language'之后改变那个以及哪个编译器改变。 cmake继续使用'.res' - 不知道为什么。无论如何,+1因为任何事情在这一点上都很有帮助,但在我尝试之前可能还有一段时间。 – Steve314 2010-08-23 11:50:57

+0

我有时间再次玩这个,事实证明,主要问题是,虽然我将其描述为一个文件格式问题,但我首先想到它是一个文件扩展问题。解决方案是重新审视windres手册,并且有意识地尝试使用“-O coff”指定coff输出格式,而不管文件扩展名是否工作。我应该已经想出了变量cmake用于RC标志,但是在文件扩展变量不起作用之后,我只是将该选项插入到模板命令中。 – Steve314 2010-08-24 10:09:56

+0

希望你不介意在接受之前给你的答案增加一点点。 – Steve314 2010-08-24 10:19:07

相关问题