Chinaunix首页 | 论坛 | 博客
  • 博客访问: 446648
  • 博文数量: 145
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1060
  • 用 户 组: 普通用户
  • 注册时间: 2013-08-22 11:52
个人简介

专注计算机技术: Linux Android 云计算 虚拟化 网络

文章分类

全部博文(145)

文章存档

2016年(3)

2015年(21)

2014年(75)

2013年(46)

我的朋友

分类: Windows平台

2014-08-17 22:48:55

    

        Windows平台下Makefile学习笔记(二)             

        分类:             Visual C++                   2127人阅读     评论(8)          举报    

作者:朱金灿

来源:http://blog.csdn.net/clever101

 

       上次我们学习了怎么用Makefile编译一个控制台工程。这次我们学习一下如何使用Makefile来编译一个win 32的GUI程序。win 32的GUI程序其编译过程大部分和控制台程序一样,不同的是多了一步RC编译器将资源文件编译成res文件,然后在最后一步链接中需要把这个res文件链接到exe文件中。

 

        好,现在让我们在实践中学习吧。新建一个win32 应用程序工程——Win32Test。让我们先完成C++代码部分的Makefile的编写,还记得Makefile的原则是以终为始吗?忘记了就翻翻上一篇:Windows平台下Makefile学习笔记(一)。具体代码如下:


#设置编译标记,初始化为FALSE  

  1. CFGSET     =  FALSE  
  2.   
  3. #定义debug版本的预处理器  
  4. CCDEBUG    = -DWIN32 -D_DEBUG -D_WINDOWS  
  5.   
  6. #定义release版本的预处理器  
  7. CCNODBG    = -DWIN32 -D_NDEBUG -D_WINDOWS  
  8.   
  9. !IFDEF debug  
  10. CC         = $(CCDEBUG)  
  11. OUTDIR = .\Debug  
  12. CFGSET     =  TRUE  
  13. !ELSE IFDEF release  
  14. CC         = $(CCNODBG)  
  15. OUTDIR = .\Release  
  16. CFGSET     =  TRUE  
  17. !ENDIF  
  18.   
  19. # 提示用法  
  20. #  
  21. !IF "$(CFGSET)"== "FALSE"  
  22. !MESSAGE Usage: nmake /f Makefile.vc [] []        
  23. !MESSAGE  
  24. !MESSAGE where  is one of:  
  25. !MESSAGE -  release=1               - build release version  
  26. !MESSAGE -  debug=1                 - build debug version  
  27. !MESSAGE  
  28. !MESSAGE  may be:  
  29. !MESSAGE -  clean                 - clear output file  
  30. !MESSAGE  
  31. !MESSAGE  
  32. !ERROR please choose a valid configuration instead"  
  33. !ENDIF  
  34.   
  35.   
  36. #这里增加了一个输出:$(OUTDIR)  
  37. all: $(OUTDIR) $(OUTDIR)\Win32Test.exe  
  38.   
  39. #假如不存在$(OUTDIR)文件夹,就创建它  
  40. $(OUTDIR) :  
  41.  if not exist "$(OUTDIR)" mkdir $(OUTDIR)  
  42.    
  43. clean:  
  44.        if exist $(OUTDIR) del $(OUTDIR)\*.ilk  
  45.        if exist $(OUTDIR) del $(OUTDIR)\*.obj  
  46.        if exist $(OUTDIR) del $(OUTDIR)\*.exe       
  47.      
  48. # compile  
  49. $(OUTDIR)\stdafx.obj: stdafx.cpp  
  50.     cl -c  $(CC) -Istdafx.h /Fo"$(OUTDIR)\\" /Fd"$(OUTDIR)\\" stdafx.cpp   
  51.      
  52. $(OUTDIR)\Win32Test.obj: Win32Test.cpp $(OUTDIR)\stdafx.obj  
  53.     cl -c  $(CC) -Istdafx.h /Fo"$(OUTDIR)\\" /Fd"$(OUTDIR)\\" Win32Test.cpp  
  54.   
  55. # link  
  56. $(OUTDIR)\Win32Test.exe: $(OUTDIR)\Win32Test.obj  
  57.     link /machine:x86 /INCREMENTAL:YES /NOLOGO /subsystem:WINDOWS /out:$(OUTDIR)\Win32Test.exe $(OUTDIR)\Win32Test.obj kernel32.lib user32.lib  


 

           我们执行一下这个Makefile: nmake /f makefile.vc debug=1

发现在Debug目录下确实生成了一个Win32Test.exe,但是我们双击它,却无法运行起来,显然是缺少了一个资源生成文件,即res文件。编译res文件需要用到编译工具rc.exe。rc.exe的常用参数有如下:

 

/n  —— 在字符串表(一种资源类型)中的所有字符都将有0结束符

/v  —— 显示编译器在编译过程中输入的信息

/fo —— 指定res输出文件的文件名

 

    其它的参数可以通过命令rc.exe /?来查询。

    那么让我们再添加编译资源文件这一部分吧(下面红色部分的就是添加和修改部分):

  1. #设置编译标记,初始化为FALSE  
  2. CFGSET     =  FALSE  
  3.   
  4. #定义debug版本的预处理器  
  5. CCDEBUG    = -DWIN32 -D_DEBUG -D_WINDOWS  
  6.   
  7. #定义release版本的预处理器  
  8. CCNODBG    = -DWIN32 -D_NDEBUG -D_WINDOWS  
  9.   
  10. !IFDEF debug  
  11. CC         = $(CCDEBUG)  
  12. OUTDIR = .\Debug  
  13. CFGSET     =  TRUE  
  14. !ELSE IFDEF release  
  15. CC         = $(CCNODBG)  
  16. OUTDIR = .\Release  
  17. CFGSET     =  TRUE  
  18. !ENDIF  
  19.   
  20. # 提示用法  
  21. #  
  22. !IF "$(CFGSET)"== "FALSE"  
  23. !MESSAGE Usage: nmake /f Makefile.vc [] []        
  24. !MESSAGE  
  25. !MESSAGE where  is one of:  
  26. !MESSAGE -  release=1               - build release version  
  27. !MESSAGE -  debug=1                 - build debug version  
  28. !MESSAGE  
  29. !MESSAGE  may be:  
  30. !MESSAGE -  clean                 - clear output file  
  31. !MESSAGE  
  32. !MESSAGE  
  33. !ERROR please choose a valid configuration instead"  
  34. !ENDIF  
  35.   
  36.   
  37. #这里增加了一个输出:$(OUTDIR)  
  38. all: $(OUTDIR) $(OUTDIR)\Win32Test.exe  
  39.   
  40. #假如不存在$(OUTDIR)文件夹,就创建它  
  41. $(OUTDIR) :  
  42.  if not exist "$(OUTDIR)" mkdir $(OUTDIR)  
  43.    
  44. clean:  
  45.        if exist $(OUTDIR) del $(OUTDIR)\*.ilk  
  46.        if exist $(OUTDIR) del $(OUTDIR)\*.obj  
  47.        if exist $(OUTDIR) del $(OUTDIR)\*.exe       
  48.        if exist $(OUTDIR) del $(OUTDIR)\*.res      
  49.      
  50. # compile  
  51. $(OUTDIR)\stdafx.obj: stdafx.cpp  
  52.     cl -c  $(CC) -Istdafx.h /Fo"$(OUTDIR)\\" /Fd"$(OUTDIR)\\" stdafx.cpp   
  53.      
  54. $(OUTDIR)\Win32Test.obj: Win32Test.cpp $(OUTDIR)\stdafx.obj  
  55.     cl -c  $(CC) -Istdafx.h /Fo"$(OUTDIR)\\" /Fd"$(OUTDIR)\\" Win32Test.cpp  
  56.   
  57. # compile resource script  
  58.     rc.exe /n /v /fo $(OUTDIR)\Win32Test.res Win32Test.rc  
  59.   
  60. # link  
  61. $(OUTDIR)\Win32Test.exe: $(OUTDIR)\Win32Test.obj  
  62.     link /machine:x86 /INCREMENTAL:YES /NOLOGO /subsystem:WINDOWS /out:$(OUTDIR)\Win32Test.exe $(OUTDIR)\Win32Test.obj $(OUTDIR)\Win32Test.res kernel32.lib user32.lib  



        让我们再搞得高级一些,用Makefile编译一个MFC工程(基于对话框)——DlgTest。具体的Makefile代码如下:

  1. #设置编译标记,初始化为FALSE  
  2. CFGSET     =  FALSE  
  3.   
  4. #定义debug版本的预处理器  
  5. CCDEBUG    = -DWIN32 -D_DEBUG -D_WINDOWS  
  6.   
  7. #定义release版本的预处理器  
  8. CCNODBG    = -DWIN32 -D_NDEBUG -D_WINDOWS  
  9.   
  10. !IFDEF debug  
  11. CC         = $(CCDEBUG)  
  12. OUTDIR = .\Debug  
  13. CFGSET     =  TRUE  
  14. !ELSE IFDEF release  
  15. CC         = $(CCNODBG)  
  16. OUTDIR = .\Release  
  17. CFGSET     =  TRUE  
  18. !ENDIF  
  19.   
  20. # 提示用法  
  21. #  
  22. !IF "$(CFGSET)"== "FALSE"  
  23. !MESSAGE Usage: nmake /f Makefile.vc [] []        
  24. !MESSAGE  
  25. !MESSAGE where  is one of:  
  26. !MESSAGE -  release=1               - build release version  
  27. !MESSAGE -  debug=1                 - build debug version  
  28. !MESSAGE  
  29. !MESSAGE  may be:  
  30. !MESSAGE -  clean                 - clear output file  
  31. !MESSAGE  
  32. !MESSAGE  
  33. !ERROR please choose a valid configuration instead"  
  34. !ENDIF  
  35.   
  36.   
  37. #这里增加了一个输出:$(OUTDIR)  
  38. all: $(OUTDIR) $(OUTDIR)\DlgTest.exe  
  39.   
  40. #假如不存在$(OUTDIR)文件夹,就创建它  
  41. $(OUTDIR) :  
  42.  if not exist "$(OUTDIR)" mkdir $(OUTDIR)  
  43.    
  44. clean:  
  45.        if exist $(OUTDIR) del $(OUTDIR)\*.ilk  
  46.        if exist $(OUTDIR) del $(OUTDIR)\*.obj  
  47.        if exist $(OUTDIR) del $(OUTDIR)\*.exe       
  48.        if exist $(OUTDIR) del $(OUTDIR)\*.res      
  49.      
  50. # compile  
  51. $(OUTDIR)\stdafx.obj: stdafx.cpp  
  52.     cl -c  $(CC) -Istdafx.h /Fo"$(OUTDIR)\\" /Fd"$(OUTDIR)\\" stdafx.cpp   
  53.      
  54. $(OUTDIR)\DlgTest.obj: DlgTest.cpp $(OUTDIR)\stdafx.obj  
  55.     cl -c  $(CC) -Istdafx.h /Fo"$(OUTDIR)\\" /Fd"$(OUTDIR)\\" DlgTest.cpp  
  56.   
  57. $(OUTDIR)\DlgTestDlg.obj: DlgTestDlg.cpp $(OUTDIR)\stdafx.obj  
  58.     cl -c  $(CC) -Istdafx.h /Fo"$(OUTDIR)\\" /Fd"$(OUTDIR)\\" DlgTestDlg.cpp  
  59.   
  60. # compile resource script  
  61.     rc.exe /n /v /fo $(OUTDIR)\DlgTest.res DlgTest.rc  
  62.   
  63. # link  
  64. $(OUTDIR)\DlgTest.exe: $(OUTDIR)\DlgTest.obj $(OUTDIR)\DlgTestDlg.obj  
  65.     link /machine:x86 /INCREMENTAL:YES /NOLOGO /subsystem:WINDOWS /out:$(OUTDIR)\DlgTest.exe $(OUTDIR)\DlgTest.obj $(OUTDIR)\DlgTestDlg.obj $(OUTDIR)\DlgTest.res kernel32.lib user32.lib  

         和Win32应用程序的Makefile比较可以知道,MFC程序的Makefile和Win 32GUI程序的步骤和过程基本一致。

 

         Windows平台下Makefile学习就此告一段落了,你学会了吗?

 

参考文献:


1. 精通Windows API,范文庆、周彬彬、安靖编著

阅读(938) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~