GNU make管理项目2006-3-10

HumenSCUT Post at 2006/3/10 16:11:00

GNU make管理项目2006-3-10
************************************************************
** 为何使用make?

** makefile 可以解决两个问题:
** 1.包含多个源代码文件的项目在编译时都有复杂的命令行。
** 2.编程项目经常需要使用那些很少用到且难以记忆的特殊编译选项。

** PS:还可以减少重复编译所需要的时间。

************************************************************
** 编写makefile

** make 可以编写规则,第条规则包括以下内容:
** 1.target:          一个目标体,即make最终需要创建的东西
** 2.dependency list: 包含一个或多个“依赖体”的列表,依赖体通常是编译目标需要的其他文件
** 3.command list:    为了从指定的依赖体创建出目标体所需要执行的“命令”的列表

** ps:
   1.目标体通常都是程序,但它们可以是诸如文本文件、手册页面等任何东西。甚至能测试和设置环境 

    变量
   2.命令可以是编译器的命令,也可以是shell命令,它们能设置环境变量、删除文件或者任何命令行所

   能完成的功能
   3.GNU make被调用后会顺序查找名为 GNUmakefile-->makefile(或Makefile文件)。大多程序员使用

Makefile
**
   target : dependency [dependency[...]]
            command   
            command
            [...]
  1. targe 是需要创建的二进制文件或目标文件。
注意:
  2. 每一个命令的第一个字符必须是制表符,仅使用8个空格是不够的,如果把制表符转为空格也会出现

问题;因为如果用空格代替制表符, make执行过程中显示:missing separator(分隔符)并停止
  3. 除特别指定,否则make的工作目录就是当前目录。
**
**
**

** 例:
** hello.o + helper.o + helper.h-->howdy(.exe)   第一句,make要创建的文件
** helper.c-->helper.o      第二句,告诉make怎样生成helper.o
** howdy.c -->howdy.o      第三句,告诉make怎样生成howdy.o
** hello.c -->hello.o       第四句,告诉make怎样生成hello.o
** gcc 的-c选项,表示只创建目标文件,但跳过链接。
** 伪目标clean
/**************************************************************/
howdy : hody.o helper.o helper.h
 gcc howdy.o helper.o -o howdy

helper.o: helper.c helper.h
 gcc -c helper.c

/* ps:***helper.c + helper.h --> helper.o****************/

howdy.o: howdy.c
 gcc-c howdy.c

/*** ps :howdy.c -->howdy.o ****************************/

hello:  hello.c
 gcc hello.c -o hello
/*** ps : hello.c -->hello.o *****************************/

all: howdy hello

.PHONY : clean /make不检查是否存在有文件我和依赖体中的一个名字相匹配的文件,而直接执行与之相

关的命令*******/
clean:
 rm howdy hello *.o

编译dowdy,只需在makefile 所在目录下输入make即可。

/*************************************************************************/
变量:
为了编辑和维护makefile,make允许在makefile中创建和使用变量(变量用大写)。
宣言变量的方法:VARNAME=some_text[]
引用变量的方法:$(VARNAME)
例:TOPDIR=/home/kwall/myproject

自动变量:
$@    规则的目标所对应的文件名
$<     规则的目标所相关的文件名
$^     规则中所有相关文件的列表,以空格为分隔符
$?     规则中日期新于目标的所有相关文件的列表,以空格为分隔符
$(@ D) 目标文件的目录部分(如果目标在子目录中)
$(@ F) 目标文件的文件名部分(如果目标在子目录中)

用于程序名和标志的预定义变量:
AR     归档维护程序,默认值=ar  
AS     汇编程序,默认值=as  
CC     C编译程序,默认值=cc
CPP    C预处理程序,默认值=cpp  
RM     文件删除程序,默认值="rm-f"
ARFLAGS传给汇编程序的标志,默认值=rv
SFLAGS 传给C编译器的标志
CPPFLAGS传给C预处理器的标志
LDFLAGS 传给链接程序(ld)的标志

/*************************************************************************************/
隐匿规则,模式规则

/*************************************************************************************/
注释:
方法:插入注释时加#
/*************************************************************************************/
命令行选项和参数

-d 打印调试信息
/*************************************************************************************/

 

 

 


 

已有 5 位网友发表了看法