VC的makefile编写

来源:互联网 发布:编程器是什么 编辑:程序博客网 时间:2024/04/20 06:15

注:摘录侯俊杰--在 console mode 中使用 C/C++ 编译器,更多参照http://jjhou.csdn.net/article99-10.htm

1、DOS下运行VC++自带的nmake

1、设置C/C++编译器需要的环境变量

INCLUDE:告诉编译器,必要的header files在哪

LIB:告诉编译器,必要的libraries在哪

PATH:设置编译器目录,MSPDB60.DLL路径等


以 Visual C++ 为例,如果安装後的档案布局如下:

C:\MSDEV\VC98\BIN : 这里放有编译器 CL.EXE

         注:编译器 CL.EXE 执行时需要 MSPDB60.DLL,而它被安装於 C:\MSDEV\COMMON\MSDEV98\BIN 之中。
C:\MSDEV\VC98\INCLUDE : 这里放有 C/C++ header files
C:\MSDEV\VC98\LIB : 这里放有 C/C++ standard libraries

那麽你可以写一个批次档如下:

set PATH=C:\MSDEV\VC98\BIN;C:\MSDEV\COMMON\MSDEV98\BIN
set INCLUDE=C:\MSDEV\VC98\INCLUDE
set LIB=C:\MSDEV\VC98\LIB


使用MFC

set PATH=C:\MSDEV\VC98\BIN;C:\MSDEV\COMMON\MSDEV98\BIN
set INCLUDE=C:\MSDEV\VC98\INCLUDE;C:\MSDEV\VC98\MFC\INCLUDE
set LIB=C:\MSDEV\VC98\LIB;C:\MSDEV\VC98\MFC\LIB


使用ATL

C:\MSDEV\VC98\ATL\INCLUDE


设置环境变量的三种方式

1、运行时通过set设置

2、VCVARS32.BAT

3、电脑属性-> 高级 -> 环境变量


2、编译命令

1、编译程序源码 F:\test.cpp
#include <iostream.h>
void main()
{
    cout<<"hello"<<endl;
}


2、通过命令编译

F:\> cl test.cpp

上面命令会生成test.obj及test.exe文件



3、Makefile文件编写


下面再举一个例子,也就是下面要学习的makefile文件。测试文件名为mypath.mak(你可以任意取名),依旧存储在当前路径下。

===========================
all:  
@echo   $(PATH)
==========================

运行命令nmake mypath.mak,你可以看到输出结果为你刚才设置过的路径(我的结果是D:\Program Files\Microsoft Visual Studio\VC98\Bin;D:\Program Files\Microsoft Visual Studio\Common\MSDev98\Bin)。

2.产生自己的makefile文件

下面是我在网上找到的一个简单的例子及其解说(http://www.readygo.com.cn/it-1104697.html

==================================
下面来看一个简单的例子(以下内容均以Win32平台为例):  
文件名:makefile  
1.   #   makefile  
2.   #   this   is   a   example   of   make   file  
3.   all:a1   a2  
4.       @echo   this   is   all!  
5.   a1:  
6.       @echo   this   is   a1!  
7.   a2:  
8.       @echo   this   is   a2!  
   
运行make后,结果如下:  
this   is   a1!  
this   is   a2!  
this   is   all!  
   
现在让我们来分析一下这个简单的规则文件。
  
       第1、2行不用说,一眼就可以看出是注释。在Make规则文件中,注释是以“#”开始,是行注释,和C++中的“//”功能一样。不过你可不能把它放到其它的语句之后,否则就错了。第3行就是规则开始了!all:a1   a2一行中,规则的名字就是all,它通常是目标名(target)。一条规则可以有不止一个名字,像这一行,你也可以把它写成all   all2:a1   a2。这时,规则就有了两个名称—all和all2。当然,还可以有更多,都看你自己。后面的5、7两行也分别是两条规则的起始。在“:”之后的,就是依赖项。在这一行里,依赖项有两个,分别是a1和a2。这些依赖项可以是其它的规则名(目标名),也可以是文件名。依赖和目标之间的关系就是“依赖关系”。一条规则中,可以有零个(像后面的两条规则)、一个或多个依赖。第4行@echo   this   is   all!是命令行。它是执行all规则时要执行的命令。要注意的是,一条规则内的命令要以tab为一行的起始,以表示命令是属于一个规则。一条规则也可以有多条命令,每条命令占一行(要以tab开头)。至于可以使用哪些命令,这完全取决于你使用的OS和SHELL。

        当执行make时,它会找到第一条规则。然后,make就会检查依赖和目标之间的关系。如果目标比依赖旧,就执行规则,以更新目标。执行完规则就结束。如何判定目标和依赖的新旧呢?如果目标(文件)不存在,目标的时间就为0;如果目标(文件存在),目标的时间就为文件的修改时间。如果依赖项是一条规则,就执行依赖的规则(这里是一个递归),然后依赖的时间就是当前最新时间;如果是一个存在的文件,就为文件的修改时间,否则就报错。之后,就可以比较目标和依赖之间的关系。不过,有一点特殊的是,在没有依赖项时,依赖的时间为1。

        在这个例子中,make先找到规则“all”,发现目标不存在,所以目标的时间为0;然后在查找依赖“a1”,结果“a1”不存在;于是,执行规则“a1”。“a1”不存在,所以它的时间为0,而“a1”没有依赖,它的依赖时间为1;1>0,所以,执行规则“a1”。然后返回规则“all”,再检查依赖“a2”。“a2”执行过程同“a1”。这时,“all”的目标时间为0,依赖时间为最新时间。于是,执行规则“all”的命令。

       当然,大家也可以指定一条规则让make执行,比如:make   a1这个命令就是告诉make程序不去找第一条规则,而是规则“a1”来执行。并且我们还可以一次执行多条规则,比如:执行make   a1   a2就会连续执行“a1”、“a2”两条规则。  

      OK,虽然讲得很混乱,但也费了我半天的力气。大家应该有一点了解make规则的执行过程了吧。  
==============================================

依赖的基本写法如下:
Target:Dependence
          Command

==============================================
Target可以是文件名。Dependence可以是其它的target名或文件名。Command就是操作系统所运行的命令行。  
变量  
      一个make规则文件有这些内容就已经基本可以工作了。可是,当我们在编译一个程序时,如果有些内容要反复用到,每次都要写一长串的话,是很麻烦的。于是,make就引入了宏这个概念(其实也可以看成简单的脚本语言)。  
宏变量的定义如下:  
var1   =   this   is   a   macro   demo!  
var1就是变量名,它的值就是“this   is   a   macro   demo!”  
如果我们要使用这个变量的值,那只有通过$这个运算符才行—$(var1)代表的就是“this   is   a   macro   demo!”。  
如下makefile  
1.   var1   =   this   is   a   macro   demo!  
2.   all:  
3.       @echo   $(var1)  
结果输出:  
this   is   a   macro   demo!  
用户在执行命令行时也可以定义宏变量。其形式如下:  
make   all   var1=”this   is   a   test”  
执行结果为:  
this   is   a   test  
我们不仅可以使用自定义变量,还可以通过这种方式使用系统环境变量。这样可以大大方便我们建议灵活的规则。如下makefile  
1.   all:  
2.       @echo   $(WINDIR)  
执行结果为:  
C:\WINDOWS
(注意:makefile中的变量是大小写敏感的)  
==========================================

下面介绍makefile文件的一些内置变量:

==========================================
$@代表规则中的目标名(也就是规则名)。  
$<代表规则中的依赖项目。注意,它只代表规则所有依赖项目中的第一项!  
其它还有:  
$^代表规则中所有的依赖项目。  
$?代表规则中时间新于目标的依赖项目。  
不仅如此,还可以给这些特殊的变量加一些限制。  
如:  
在规则  
debug/out.exe   :   out.obj  
中,$@代表debug/out.exe,而$(@D)代表目录名debug,$(@F)代表文件名out.exe。其它如$(<D)、$(<F)、$(^D)、$(^F)、$(?D)、$(?F)与此类似。  
=============================================

举个例子说明,下面是原始makefile文件内容:

==============================================
myprog : foo.o bar.o
     gcc foo.o bar.o -o myprog
    
    foo.o : foo.c foo.h bar.h
     gcc -c foo.c -o foo.o
    
    bar.o : bar.c bar.h
     gcc -c bar.c -o bar.o
==============================================

用变量代替后的文件内容:

==============================================
OBJS = foo.o bar.o
    CC = gcc
    CFLAGS = -Wall -O -g
    
    myprog : $(OBJS)
     $(CC) $^ -o $@
    
    foo.o : foo.c foo.h bar.h
     $(CC) $(CFLAGS) -c $<-o $@
    
    bar.o : bar.c bar.h
     $(CC) $(CFLAGS) -c $<-o $@
==============================================


原创粉丝点击