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

简介: 本文转自:http://blog.csdn.net/clever101/article/details/8286066         上次我们学习了怎么用Makefile编译一个控制台工程。这次我们学习一下如何使用Makefile来编译一个win 32的GUI程序。

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

 

相关文章
|
C语言 C++ Windows
<转>Windows平台下Makefile学习笔记(一)
本文转自:http://blog.csdn.net/clever101/article/details/8147352 决心学习Makefile,一方面是为了解决编译开源代码时需要跨编译平台的问题(发现一些开源代码已经在使用VS2010开发,但我还没安装VS2010,我想在VS2008下编译这些代码);另一方面源码在服务器端编译的话,使用IDE的方式编译还是不太方便。
1226 0
|
19天前
|
网络安全 Windows
Windows server 2012R2系统安装远程桌面服务后无法多用户同时登录是什么原因?
【11月更文挑战第15天】本文介绍了在Windows Server 2012 R2中遇到的多用户无法同时登录远程桌面的问题及其解决方法,包括许可模式限制、组策略配置问题、远程桌面服务配置错误以及网络和防火墙问题四个方面的原因分析及对应的解决方案。
|
24天前
|
监控 安全 网络安全
Windows Server管理:配置与管理技巧
Windows Server管理:配置与管理技巧
63 3
|
28天前
|
存储 安全 网络安全
Windows Server 本地安全策略
由于广泛使用及历史上存在的漏洞,Windows服务器成为黑客和恶意行为者的主要攻击目标。这些系统通常存储敏感数据并支持关键服务,因此组织需优先缓解风险,保障业务的完整性和连续性。常见的威胁包括勒索软件、拒绝服务攻击、内部威胁、恶意软件感染等。本地安全策略是Windows操作系统中用于管理计算机本地安全性设置的工具,主要包括用户账户策略、安全选项、安全设置等。实施强大的安全措施,如定期补丁更新、网络分段、入侵检测系统、数据加密等,对于加固Windows服务器至关重要。
|
2月前
|
边缘计算 安全 网络安全
|
2月前
|
数据安全/隐私保护 Windows
安装 Windows Server 2019
安装 Windows Server 2019
|
2月前
|
网络协议 Windows
Windows Server 2019 DHCP服务器搭建
Windows Server 2019 DHCP服务器搭建
|
2月前
|
网络协议 定位技术 Windows
Windows Server 2019 DNS服务器搭建
Windows Server 2019 DNS服务器搭建