<转>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=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学习就此告一段落了,你学会了吗?

 

时间: 2024-11-08 20:36:49

<转>Windows平台下Makefile学习笔记(二)的相关文章

C#学习笔记(二)

笔记 C#学习笔记(二) write by cash(天下第七)2002.01.20版权所有,翻录不究cashcao@msn.com 选择 我身上携带着精神.信仰.灵魂 思想.欲望.怪癖.邪念.狐臭它们寄生于我身体的家 我必须平等对待我的每一位客人-----------伊沙:<原则> 我的名字是cash,所以我很功利主义:我的星像是Leo,所以我很大男人主义:我的语言是C#,所以我有点儿拿不定主义. /* 你能看得出来,这不是一篇正规的技术文章,所以若你不小心从里边读到了一个爱情故事,可不要奇

kvm虚拟化学习笔记(二)之linux kvm虚拟机安装

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://koumm.blog.51cto.com/703525/1289627 KVM虚拟化学习笔记系列文章列表 ---------------------------------------- kvm虚拟化学习笔记(一)之kvm虚拟化环境安装http://koumm.blog.51cto.com/703525/1288795 kvm虚拟化学习笔记(二)之linuxkvm虚拟机安装htt

用C#开发第一个WINDOWS应用程序(C#学习笔记之一)

用C#开发第一个WINDOWS应用程序C#学习笔记之一作者:浙江省温岭市电信局 王骏摘自:http://www.vckbase.com/读者层次:初级.中级前言:C#是一门现代的编程语言,包含在Visual Studio .Net 7.0中.它简化了C++的复杂性,保持了灵活性,对于学过C++的人来说很容易上手.写本文的时候Visual Studio .net 7.0 Beta1已经发布,本文即针对此版本做一些简单的开发尝试.示例代码下载 18K一.创建工程如图所示,在集成开发环境的File菜单

ssl-关于windows平台下的server端AcquireCredentialsHandle调用失败问题

问题描述 关于windows平台下的server端AcquireCredentialsHandle调用失败问题 securityFuns.AcquireCredentialsHandle执行后,返回1312错误码.如下代码: #include <schannel.h>#define SECURITY_WIN32#include <security.h>#pragma comment(libcrypt32.lib"")int _tmain(int argc _TC

Bootstrap3学习笔记(二)之排版_javascript技巧

在上篇文章给大家介绍了BootStrap3学习笔记(一)之网格系统 对于标题,Bootstrap已经修改了h1--h6的样式,如果需要副标题,还可以在其中使用small标记 <h1>h1. Bootstrap heading <small>Secondary text</small></h1> <h2>h2. Bootstrap heading <small>Secondary text</small></h2>

kvm虚拟化学习笔记(二十一)之KVM性能优化学习笔记

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://koumm.blog.51cto.com/703525/1606422 本学习笔记系列都是采用CentOS6.x操作系统,KVM虚拟机的管理也是采用virsh方式,网上的很多的文章都基于ubuntu高版本内核下,KVM的一些新的特性支持更好,本文只是记录了CentOS6.x系列操作系统下KVM优化的点,有很多都是默认支持开启了的,除了采用virtio方式的磁盘IO,与网络IO接口

MyBatis学习笔记(二)之关联关系_java

今天主要学习的关联关系是一对一关系与一对多关系. 一.一对一关系 还是通过例子来解释说明.(一个妻子对应一个丈夫). 1)数据库信息 create table t_wife( id int primary key auto_increment, wife_name varchar(), fk_husband_id int ); create table t_husband( id int primary key auto_increment, husband_name varchar() );

Caliburn.Micro学习笔记(二)----Actions

Caliburn.Micro学习笔记目录 上一篇已经简单说了一下引导类和简单的控件绑定 我的上一个例子里的button自动匹配到ViewModel事件你一定感觉很好玩吧 今天说一下它的Actions,看一下Caliburn.Micro给我们提供了多强大的支持 我们还是从做例子开始 demo的源码下载在文章的最后 例子1.无参数方法调用 点击button把textBox输入的文本弹出来 如果textbox里没有文本button不可点,看一下效果图   看一下前台代码 <StackPanel> &

Java的“对象思想”学习笔记[二]

笔记|对象 在这篇文章里我将介绍一些Java对于对象的基本处理模式的问题. 首先看一个有关对象相等性(Object equivalence)的例子: 先看下面的代码: public class EqualTest1{ public static void main(String[] args){ Integer n1 = new Integer(20); Integer n2 = new Integer(20); System.out.println(n1 = = n2); System.out