zoukankan      html  css  js  c++  java
  • <转>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学习就此告一段落了,你学会了吗?

  • 相关阅读:
    虚拟机中安装vmware tools 到 Debian 时出现 找不到kernel headers的提示
    中小企业信息安全:基本原则
    关于开源的一些注意事项
    创建Odoo8数据库时的“new encoding (UTF8) is incompatible with the encoding of the template database (SQL_ASCII)“问题
    debian8安装Odoo中的Barcode Scanner Hardware Driver模块时,提示没有evdev
    vim /vi中对字符串的查找并替换
    解决 odoo.py: error: option --addons-path: The addons-path 'local-addons/' does not seem to a be a valid Addons Directory!
    debian命令行删除postgresql数据库
    liunx修改字体为宋体
    OpenERP|odoo Web开发
  • 原文地址:https://www.cnblogs.com/zhangdongsheng/p/3175736.html
Copyright © 2011-2022 走看看