<转>Windows平台下Makefile学习笔记(二)
本文转自:http://blog.csdn.net/clever101/article/details/8286066
上次我们学习了怎么用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= - build release version
!MESSAGE - debug= - 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= - build release version
!MESSAGE - debug= - 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= - build release version
!MESSAGE - debug= - 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学习就此告一段落了,你学会了吗?
<转>Windows平台下Makefile学习笔记(二)的更多相关文章
- [转]Windows平台下Makefile学习笔记
Windows平台下Makefile学习笔记(一) 作者:朱金灿 来源:http://blog.csdn.net/clever101 决心学习Makefile,一方面是为了解决编译开源代码时需要跨编译 ...
- 【VS开发】Windows平台下Makefile学习笔记
作者:朱金灿 来源:http://blog.csdn.net/clever101 决心学习Makefile,一方面是为了解决编译开源代码时需要跨编译平台的问题(发现一些开源代码已经在使用VS2010开 ...
- <转>Windows平台下Makefile学习笔记(一)
本文转自:http://blog.csdn.net/clever101/article/details/8147352 决心学习Makefile,一方面是为了解决编译开源代码时需要跨编译平台的问题(发 ...
- windows平台下VLC2.0.5编译
windows平台下VLC2.0.5编译说明 时隔一年多,又要搞流媒体了,不过这次是要做流媒体服务器. 暂时决定使用vlc+ffmpeg+live555,虽然听有些前辈说这个组合的性能较差,只能作为学 ...
- Windows平台下MySQL常用操作与命令
Windows平台下MySQL常用操作与命令 Windows平台下MySQL常用操作与命令,学习mysql的朋友可以参考下. 1.导出整个数据库 mysqldump -u 用户名 -p --defau ...
- Windows平台下Git服务器搭建
第一步:下载Java,下载地址:http://www.java.com/zh_CN/ 第二步:安装Java.安装步骤不再详述. 第三步:配置Java环境变量. 右键”计算机” => ”属性” = ...
- Windows平台下PHP开发环境的配置
Windows平台下PHP开发环境的配置 一.基本环境 1.Windows XP 32位 2.Apache 2.2.25,下载地址:http://mirror.bit.edu.cn/apache/ht ...
- Windows 平台下Git 服务器搭建
由于项目中一直在使用git作为版本管理,自己对git的理解.使用都还不是怎么的熟悉,所以准备深入了解一下git及一些常用命令的使用,于是干脆把服务端架上,通过自己的PC作为服务端同时作为客户端的角色进 ...
- 【转】Windows平台下Git服务器搭建
Windows平台下Git服务器搭建 Posted on 2015-05-18 21:29 阿祥当码农 阅读(7637) 评论(0) 编辑 收藏 该文章转自:http://www.codeceo.co ...
随机推荐
- awk 二
节详细介绍awk内置函数,主要分以下3种类似:算数函数.字符串函数.其它一般函数.时间函数 一.算术函数: 以下算术函数执行与 C 语言中名称相同的子例程相同的操作: 函数名 说明 atan2( y, ...
- ubuntu14.04LTS openssh-server 手动安装配置步骤
先用能上网的机器下载:zlib-1.2.5.tar.bz2.openssh-5.6p1.tar.gz.openssl-0.9.8o.tar.tar,接下来,准备安装. 步骤如下: 1.首先解压安装zl ...
- kubernetes节点安装配置
#环境安装,要与控制节点一致Centos 7 Linux release 7.3.1611网络: 互通配置主机名设置各个服务器的主机名hosts#查找kubernetes支持的docker版本Kube ...
- 使用clamav查杀病毒
cd ~ wget http://www.zlib.net/fossils/zlib-1.2.8.tar.gz .tar.gz cd zlib- ./configure --prefix=/usr/l ...
- 【转载】Photoshop-制作图片圆角2种方法
学习网址:http://www.23ps.com/photoshop/cjjc/300002034.htm 方案一: 使用选区和蒙版相结合,用图章制作圆角选区,删除多余部分 效果: 实现步骤: 一.如 ...
- 关于delphi编程的网络文件夹复制的代码精要
首先必须引用windows api函数库 shellapi ***************************以下为复制文件夹的代码******************************** ...
- POJ 2828.Buy Tickets-完全版线段树(单点更新、逆序遍历查询)
POJ2828.Buy Tickets 这个题是插队问题,每次有人插队的时候,其后的所有数据都要进行更新,如果我们反着推,就可以把所有的数据都安排好并且不用再对已插入的数据进行更新,因为逆序处理的话所 ...
- python获取小程序手机号并绑定
最近在做小程序开发,在其中也遇到了很多的坑,获取小程序的手机号并绑定就遇到了一个很傻的坑. 流程介绍 官方流程图 小程序使用方法 需要将 <button> 组件 open-type 的值设 ...
- 2-SAT浅谈
2-SAT浅谈 一.2-SAT问题 首先,什么是$2-SAT$问题.现在给出这样一类问题:给出$n$个点和关于这$n$个点的$m$条限制条件,并且这$n$个点中,每一个点只有两种状态.对于上述问题,我 ...
- [BZOJ2142]礼物(扩展Lucas)
2142: 礼物 Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 2286 Solved: 1009[Submit][Status][Discuss] ...