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

 

相关文章
|
2月前
|
XML C# 数据格式
掌握了在Windows平台上查看DLL依赖的方法
掌握了在Windows平台上查看DLL依赖的方法
260 4
|
3月前
|
监控 Windows
Windows平台RTSP|RTMP播放器如何实时调节音量
我们在做Windows平台RTSP、RTMP播放器的时候,有这样的技术需求,特别是多路监控的时候,并不是每一路audio都需要播放出来的,所以,这时候,需要有针对音量调节的设计
|
2月前
|
NoSQL Shell MongoDB
Windows 平台安装 MongoDB
10月更文挑战第10天
56 0
Windows 平台安装 MongoDB
|
3月前
|
监控 C# 块存储
Windows平台RTSP|RTMP播放器如何叠加OSD文字
做Windows平台RTSP|RTMP播放器的时候,特别是多路播放场景下,开发者希望可以给每一路RTSP或RTMP流添加个额外的OSD台标,以区分不同的设备信息(比如添加摄像头所在位置),本文主要探讨,如何动态添加OSD台标。
Windows平台RTSP|RTMP播放器如何叠加OSD文字
|
2月前
|
Windows
重装系统学习笔记(一):Windows10重装步骤(正版)
这篇博客文章详细介绍了如何使用微软官方工具重装Windows 10系统,包括下载安装工具、准备U盘、设置BIOS以及系统安装的步骤。
48 0
重装系统学习笔记(一):Windows10重装步骤(正版)
|
3月前
|
Docker Windows Python
Windows-Docker学习笔记(一)
本文介绍了Windows环境下Docker的安装与使用方法。首先通过链接下载Windows版本的Docker,然后按步骤配置:启用Windows功能、设置默认WSL版本为2,并检查Docker及其组件是否正常工作。接着详细列出了Docker的基础命令及其用法,包括搜索、下载镜像、管理容器等。同时介绍了Dockerfile的编写方法及其构建过程,以及docker-compose.yml文件的用途。最后提供了运行和管理容器的具体示例。
Windows-Docker学习笔记(一)
|
3月前
|
Linux Android开发 iOS开发
Windows平台RTSP|RTMP播放器如何实现实时录像功能
Windows平台RTSP、RTMP播放器实时录像接口设计,实际上,除了Windows平台,我们Linux、Android、iOS平台也是一样的设计,单纯的录像模块,如果做的全面,也不是一两个接口可以搞定的
|
2月前
|
并行计算 开发工具 异构计算
在Windows平台使用源码编译和安装PyTorch3D指定版本
【10月更文挑战第6天】在 Windows 平台上,编译和安装指定版本的 PyTorch3D 需要先安装 Python、Visual Studio Build Tools 和 CUDA(如有需要),然后通过 Git 获取源码。建议创建虚拟环境以隔离依赖,并使用 `pip` 安装所需库。最后,在源码目录下运行 `python setup.py install` 进行编译和安装。完成后即可在 Python 中导入 PyTorch3D 使用。
246 0
|
4月前
|
Windows
Windows平台如何修改监听的服务名称?
【8月更文挑战第15天】在Windows平台上可透过注册表编辑器、命令提示符或第三方工具修改服务的显示名称。首先,通过注册表编辑器找到`HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services`下的目标服务,修改其“DisplayName”键值。或者,在命令提示符中使用`sc config`命令来变更服务名称。此外,利用第三方工具如Windows Service Manager也能简化此过程。修改前请确保了解可能的影响并做好备份。
106 4
WK
|
4月前
|
存储 JavaScript 前端开发
如何在Windows平台上手micro:bit
micro:bit是一款口袋大小的可编程计算机,使用ARM处理器,跨平台兼容性强,适用于青少年学习编程。通过USB接口轻松连接Windows电脑,找到“MICROBIT”文件夹开始互动。提供MakeCode(支持拖拽编程及JavaScript)和MicroPython平台,满足不同编程需求。创建项目后,下载.hex文件至micro:bit,即可运行程序,展现创意成果。
WK
71 1