博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
<转>Windows平台下Makefile学习笔记(二)
阅读量:6328 次
发布时间:2019-06-22

本文共 5721 字,大约阅读时间需要 19 分钟。

  本文转自:   

 

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

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

#设置编译标记,初始化为FALSECFGSET     =  FALSE#定义debug版本的预处理器CCDEBUG    = -DWIN32 -D_DEBUG -D_WINDOWS#定义release版本的预处理器CCNODBG    = -DWIN32 -D_NDEBUG -D_WINDOWS!IFDEF debugCC         = $(CCDEBUG)OUTDIR = .\DebugCFGSET     =  TRUE!ELSE IFDEF releaseCC         = $(CCNODBG)OUTDIR = .\ReleaseCFGSET     =  TRUE!ENDIF# 提示用法#!IF "$(CFGSET)"== "FALSE"!MESSAGE Usage: nmake /f Makefile.vc [
] [
] !MESSAGE!MESSAGE where
is one of:!MESSAGE - release=1 - build release version!MESSAGE - debug=1 - build debug version!MESSAGE!MESSAGE
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 /?来查询。

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

 

#设置编译标记,初始化为FALSECFGSET     =  FALSE#定义debug版本的预处理器CCDEBUG    = -DWIN32 -D_DEBUG -D_WINDOWS#定义release版本的预处理器CCNODBG    = -DWIN32 -D_NDEBUG -D_WINDOWS!IFDEF debugCC         = $(CCDEBUG)OUTDIR = .\DebugCFGSET     =  TRUE!ELSE IFDEF releaseCC         = $(CCNODBG)OUTDIR = .\ReleaseCFGSET     =  TRUE!ENDIF# 提示用法#!IF "$(CFGSET)"== "FALSE"!MESSAGE Usage: nmake /f Makefile.vc [
] [
] !MESSAGE!MESSAGE where
is one of:!MESSAGE - release=1 - build release version!MESSAGE - debug=1 - build debug version!MESSAGE!MESSAGE
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
rc.exe /n /v /fo $(OUTDIR)\Win32Test.res Win32Test.rc# link$(OUTDIR)\Win32Test.exe: $(OUTDIR)\Win32Test.obj 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代码如下:

#设置编译标记,初始化为FALSECFGSET     =  FALSE#定义debug版本的预处理器CCDEBUG    = -DWIN32 -D_DEBUG -D_WINDOWS#定义release版本的预处理器CCNODBG    = -DWIN32 -D_NDEBUG -D_WINDOWS!IFDEF debugCC         = $(CCDEBUG)OUTDIR = .\DebugCFGSET     =  TRUE!ELSE IFDEF releaseCC         = $(CCNODBG)OUTDIR = .\ReleaseCFGSET     =  TRUE!ENDIF# 提示用法#!IF "$(CFGSET)"== "FALSE"!MESSAGE Usage: nmake /f Makefile.vc [
] [
] !MESSAGE!MESSAGE where
is one of:!MESSAGE - release=1 - build release version!MESSAGE - debug=1 - build debug version!MESSAGE!MESSAGE
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学习就此告一段落了,你学会了吗?

 

转载地址:http://ukmaa.baihongyu.com/

你可能感兴趣的文章
在某公司工作一年的自我总结01
查看>>
通过Jetty搭建一个简单的Servlet运行环境
查看>>
装上了Fedora19
查看>>
BLDC之六种霍尔检测换相排序表
查看>>
JfreeCHart 异常:Chart image not found
查看>>
设计模式之——单例模式
查看>>
全志a13开发总结
查看>>
用 PS 调整服务器时间
查看>>
让工作自动化
查看>>
Lucene:为文本文件创建索引
查看>>
hive函数参考手册
查看>>
2019年川甘青三省三县迎新春文艺演出在四川阿坝县举行
查看>>
日本长崎市着手为和平祈念像重新上色
查看>>
春运里的铁路桥梁工:攀爬检查犹如“蜘蛛侠”
查看>>
第91届奥斯卡公布入围名单 四名华裔电影人入围
查看>>
安徽现首套被动房 可自主“呼吸”
查看>>
冬训成果何在?林丹无缘新赛季首冠状态成迷
查看>>
一个连区块链是什么都不知道的财经“专家”也敢谈比特币是泡沫?
查看>>
程序员面试被要求手写代码,你与顶级程序员的差别在哪?
查看>>
JavaScript是如何工作的: CSS 和 JS 动画底层原理及如何优化它们的性能
查看>>