作者:朱金灿 来源: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
- CFGSET = FALSE
-
- #定义debug版本的预处理器
- CCDEBUG = -DWIN32 -D_DEBUG -D_WINDOWS
-
- #定义release版本的预处理器
- CCNODBG = -DWIN32 -D_NDEBUG -D_WINDOWS
-
- !IFDEF debug
- CC = $(CCDEBUG)
- OUTDIR = .\Debug
- CFGSET = TRUE
- !ELSE IFDEF release
- CC = $(CCNODBG)
- OUTDIR = .\Release
- CFGSET = TRUE
- !ENDIF
-
- # 提示用法
- #
- !IF "$(CFGSET)"== "FALSE"
- !MESSAGE Usage: nmake /f Makefile.vc [<config>] [<target>]
- !MESSAGE
- !MESSAGE where <config> is one of:
- !MESSAGE - release=1 - build release version
- !MESSAGE - debug=1 - build debug version
- !MESSAGE
- !MESSAGE <target> may be:
- !MESSAGE - clean - clear output file
- !MESSAGE
- !MESSAGE
- !ERROR please choose a valid configuration instead"
- !ENDIF
-
-
- #这里增加了一个输出:$(OUTDIR)
- all: $(OUTDIR) $(OUTDIR)\Win32Test.exe
-
- #假如不存在$(OUTDIR)文件夹,就创建它
- $(OUTDIR) :
- if not exist "$(OUTDIR)" mkdir $(OUTDIR)
-
- clean:
- if exist $(OUTDIR) del $(OUTDIR)\*.ilk
- if exist $(OUTDIR) del $(OUTDIR)\*.obj
- if exist $(OUTDIR) del $(OUTDIR)\*.exe
-
- # compile
- $(OUTDIR)\stdafx.obj: stdafx.cpp
- cl -c $(CC) -Istdafx.h /Fo"$(OUTDIR)\\" /Fd"$(OUTDIR)\\" stdafx.cpp
-
- $(OUTDIR)\Win32Test.obj: Win32Test.cpp $(OUTDIR)\stdafx.obj
- cl -c $(CC) -Istdafx.h /Fo"$(OUTDIR)\\" /Fd"$(OUTDIR)\\" Win32Test.cpp
-
- # link
- $(OUTDIR)\Win32Test.exe: $(OUTDIR)\Win32Test.obj
- 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 /?来查询。 那么让我们再添加编译资源文件这一部分吧(下面红色部分的就是添加和修改部分): - #设置编译标记,初始化为FALSE
- CFGSET = FALSE
-
- #定义debug版本的预处理器
- CCDEBUG = -DWIN32 -D_DEBUG <span style="color:#FF0000;">-D_WINDOWS</span>
-
- #定义release版本的预处理器
- CCNODBG = -DWIN32 -D_NDEBUG <span style="color:#FF0000;">-D_WINDOWS</span>
-
- !IFDEF debug
- CC = $(CCDEBUG)
- OUTDIR = .\Debug
- CFGSET = TRUE
- !ELSE IFDEF release
- CC = $(CCNODBG)
- OUTDIR = .\Release
- CFGSET = TRUE
- !ENDIF
-
- # 提示用法
- #
- !IF "$(CFGSET)"== "FALSE"
- !MESSAGE Usage: nmake /f Makefile.vc [<config>] [<target>]
- !MESSAGE
- !MESSAGE where <config> is one of:
- !MESSAGE - release=1 - build release version
- !MESSAGE - debug=1 - build debug version
- !MESSAGE
- !MESSAGE <target> may be:
- !MESSAGE - clean - clear output file
- !MESSAGE
- !MESSAGE
- !ERROR please choose a valid configuration instead"
- !ENDIF
-
-
- #这里增加了一个输出:$(OUTDIR)
- all: $(OUTDIR) $(OUTDIR)\Win32Test.exe
-
- #假如不存在$(OUTDIR)文件夹,就创建它
- $(OUTDIR) :
- if not exist "$(OUTDIR)" mkdir $(OUTDIR)
-
- clean:
- if exist $(OUTDIR) del $(OUTDIR)\*.ilk
- if exist $(OUTDIR) del $(OUTDIR)\*.obj
- if exist $(OUTDIR) del $(OUTDIR)\*.exe
- if exist $(OUTDIR) del $(OUTDIR)\*.res
-
- # compile
- $(OUTDIR)\stdafx.obj: stdafx.cpp
- cl -c $(CC) -Istdafx.h /Fo"$(OUTDIR)\\" /Fd"$(OUTDIR)\\" stdafx.cpp
-
- $(OUTDIR)\Win32Test.obj: Win32Test.cpp $(OUTDIR)\stdafx.obj
- cl -c $(CC) -Istdafx.h /Fo"$(OUTDIR)\\" /Fd"$(OUTDIR)\\" Win32Test.cpp
-
- # compile resource script
- <span style="color:#FF0000;"> rc.exe /n /v /fo $(OUTDIR)\Win32Test.res Win32Test.rc</span>
-
- # link
- $(OUTDIR)\Win32Test.exe: $(OUTDIR)\Win32Test.obj
- link /machine:x86 /INCREMENTAL:YES /NOLOGO <span style="color:#FF0000;">/subsystem:WINDOWS</span> /out:$(OUTDIR)\Win32Test.exe $(OUTDIR)\Win32Test.obj $(OUTDIR)\Win32Test.res kernel32.lib <span style="color:#FF0000;">user32.lib</span>
让我们再搞得高级一些,用Makefile编译一个MFC工程(基于对话框)——DlgTest。具体的Makefile代码如下:
- #设置编译标记,初始化为FALSE
- CFGSET = FALSE
-
- #定义debug版本的预处理器
- CCDEBUG = -DWIN32 -D_DEBUG -D_WINDOWS
-
- #定义release版本的预处理器
- CCNODBG = -DWIN32 -D_NDEBUG -D_WINDOWS
-
- !IFDEF debug
- CC = $(CCDEBUG)
- OUTDIR = .\Debug
- CFGSET = TRUE
- !ELSE IFDEF release
- CC = $(CCNODBG)
- OUTDIR = .\Release
- CFGSET = TRUE
- !ENDIF
-
- # 提示用法
- #
- !IF "$(CFGSET)"== "FALSE"
- !MESSAGE Usage: nmake /f Makefile.vc [<config>] [<target>]
- !MESSAGE
- !MESSAGE where <config> is one of:
- !MESSAGE - release=1 - build release version
- !MESSAGE - debug=1 - build debug version
- !MESSAGE
- !MESSAGE <target> may be:
- !MESSAGE - clean - clear output file
- !MESSAGE
- !MESSAGE
- !ERROR please choose a valid configuration instead"
- !ENDIF
-
-
- #这里增加了一个输出:$(OUTDIR)
- all: $(OUTDIR) $(OUTDIR)\DlgTest.exe
-
- #假如不存在$(OUTDIR)文件夹,就创建它
- $(OUTDIR) :
- if not exist "$(OUTDIR)" mkdir $(OUTDIR)
-
- clean:
- if exist $(OUTDIR) del $(OUTDIR)\*.ilk
- if exist $(OUTDIR) del $(OUTDIR)\*.obj
- if exist $(OUTDIR) del $(OUTDIR)\*.exe
- if exist $(OUTDIR) del $(OUTDIR)\*.res
-
- # compile
- $(OUTDIR)\stdafx.obj: stdafx.cpp
- cl -c $(CC) -Istdafx.h /Fo"$(OUTDIR)\\" /Fd"$(OUTDIR)\\" stdafx.cpp
-
- $(OUTDIR)\DlgTest.obj: DlgTest.cpp $(OUTDIR)\stdafx.obj
- cl -c $(CC) -Istdafx.h /Fo"$(OUTDIR)\\" /Fd"$(OUTDIR)\\" DlgTest.cpp
-
- $(OUTDIR)\DlgTestDlg.obj: DlgTestDlg.cpp $(OUTDIR)\stdafx.obj
- cl -c $(CC) -Istdafx.h /Fo"$(OUTDIR)\\" /Fd"$(OUTDIR)\\" DlgTestDlg.cpp
-
- # compile resource script
- rc.exe /n /v /fo $(OUTDIR)\DlgTest.res DlgTest.rc
-
- # link
- $(OUTDIR)\DlgTest.exe: $(OUTDIR)\DlgTest.obj $(OUTDIR)\DlgTestDlg.obj
- 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,范文庆、周彬彬、安靖编著 如果你觉得我的博客对你有帮助,请在下面网址中博客之星评选活动中投我一票:
http://vote.blog.csdn.net/item/blogstar/clever101(单击候选人介绍下面的投他一票那个按钮)
参与投票有机会获奖:
最佳贡献奖:通过微博分享活动就有机会获得30元充值卡一张(每周抽选5名) 幸运奖:凡参与投票用户就有机会获得精美小礼品一份。(每周抽选5名) 积极参与奖:所有参与投票并符合条件的用户均可获得20个下载积分。
|