Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1482597
  • 博文数量: 181
  • 博客积分: 3308
  • 博客等级: 中校
  • 技术积分: 2227
  • 用 户 组: 普通用户
  • 注册时间: 2010-10-03 12:03
个人简介

我是zoro

文章分类

全部博文(181)

文章存档

2015年(1)

2013年(35)

2012年(39)

2011年(50)

2010年(56)

分类: LINUX

2010-10-26 19:06:04

   创建/bin,/lib,/srv三个子文件夹,五个函数:test.c add.c jian.c cheng.c chu.c,头文件common.h头文件内容为: 

#ifndef _COMMON_H_
#define _COMMON_H_

extern int add(int x,int y);
extern int jian(int x,int y);
extern int cheng(int x,int y);
extern int chu(int x,int y);
#endif


zx@zhangxu:~/lianxi/make$ tree

.
|-- bin
|-- include
| |-- add.h
| |-- cheng.h
| |-- chu.h
| `-- jian.h
|-- lib
`-- srv
    |-- add.c
    |-- cheng.c
    |-- chu.c
    |-- common.h
    |-- jian.c
    |-- Makefile
    |-- Makefile2
    `-- test.c

Makefile里主要包含了五个东西:显式规则、隐晦规则、变量定义、文件指示和注释。

1、显式规则。显式规则说明了,如何生成一个或多的的目标文件。这是由Makefile的书写者明显指出,要生成的文件,文件的依赖文件,生成的命令。

2、隐晦规则。由于我们的make有自动推导的功能,所以隐晦的规则可以让我们比较粗糙地简略地书写Makefile,这是由make所支持的。

3、变量的定义。在Makefile中我们要定义一系列的变量,变量一般都是字符串,这个有点你C语言中的宏,当Makefile被执行时,其中的变量都会被扩展到相应的引用位置上。

4、文件指示。其包括了三个部分,一个是在一个Makefile中引用另一个Makefile,就像C语言中的include一样;另一个是指根据某些情况指 定Makefile中的有效部分,就像C语言中的预编译#if一样;还有就是定义一个多行的命令。有关这一部分的内容,我会在后续的部分中讲述。

5、注释。Makefile中只有行注释,和UNIX的Shell脚本一样,其注释是用“#”字符,这个就像C/C++中的“//”一样。如果你要在你的Makefile中使用“#”字符,可以用反斜框进行转义,如:“\#”。

最后,还值得一提的是,
在Makefile中的命令,必须要以[Tab]键开始

Makefile的规则
target ... : prerequisites ...
            command
            ...
            ...
1)    target也就是一个目标文件,可以是Object File,也可以是执行文件。还可以是一个标签(Label),即make执行的动作的名称,没有依赖文件,如目标”clean”;
     prerequisites就是,要生成那个target所需要的文件或是目标。
command也就是make需要执行的命令。(任意的Shell命令)
    它限定了make执行这条规则时所需要的动作. 一个规则可以有多个命令行,每一条命令占一行.
        每个命令行必须以[tab]开始,告诉make这是一个命令行。

    这是一个文件的依赖关系,也就是说,target这一个或多个的目标文件依赖于prerequisites中的文件,其生成规则定义在command中。 说白一点就是说,prerequisites中如果有一个以上的文件比target文件要新的话,command所定义的命令就会被执行。这就是 Makefile的规则。也就是Makefile中最核心的内容。


通常的makefile的格式

#my first Makefile

all:exe
       @echo "my first Makefile finished"
exe:main.o add.o minu.o
        gcc -o exe main.o add.o minu.o
main.o:main.c
        gcc -c main.c common.h
add.o:add.c
        gcc -c add.c
minu.o:minu.c
        gcc -c minu.c
clean:
        rm *.o exe

注意: @符号的用途, @表示后面的命令不要显示出来

--------------------------

我自己做的第一个Makefile文件:

#第一个Makefile,生成一个库

CC=gcc
OBJ=add.o jian.o cheng.o chu.o
CW=-c -Wall
LJ=/home/zx/lianxi/make/lib/libmath.a
all:libmath
    @echo "库文件libmath.a完成!"
libmath:$(OBJ)
    ar -cr $(LJ) $^
add.o:add.c
    $(CC) $(CW) $<
jian.o:jian.c
    $(CC) $(CW) $<
cheng.o:cheng.c
    $(CC) $(CW) $<
chu.o:chu.c
    $(CC) $(CW) $<
clean:
    rm *.o

第二个makefile文件,Makefile2

#Makefile2,生成一个库

LJ=/home/zx/lianxi/make/bin/exe
CC=gcc
OB=add.o jian.o cheng.o chu.o
LJB=/home/zx/lianxi/make/lib/libmathb.a
LJC=-L ../lib/ -l mathb common.h
all:exe
    @echo "可执行程序exe完成!"
exe:test.c libmath
    $(CC) -o $(LJ) $< $(LJC)
libmath:$(OB)
    ar -cr $(LJB) $(OB)
clean:
    rm *.o $(LJB)

   相比两个文件,第二个文件少打了第一个文件中10-17行中的内容,但都能正常运行,自动生成依赖性。

运行前
|-- bin
|-- lib
`-- srv
    |-- add.c
    |-- cheng.c
    |-- chu.c
    |-- common.h
    |-- jian.c
    |-- Makefile
    |-- Makefile2
    `-- test.c

单独运行Makefile
zx@zhangxu:~/lianxi/make/srv$ make
gcc -c -Wall add.c
gcc -c -Wall jian.c
gcc -c -Wall cheng.c
gcc -c -Wall chu.c
ar -cr /home/zx/lianxi/make/lib/libmath.a add.o jian.o cheng.o chu.o
库文件libmath.a完成!
--------------------------------
单独运行Makefile2

zx@zhangxu:~/lianxi/make/srv$ make -f Makefile2
gcc -c -o add.o add.c
gcc -c -o jian.o jian.c
gcc -c -o cheng.o cheng.c
gcc -c -o chu.o chu.c
ar -cr /home/zx/lianxi/make/lib/libmathb.a add.o jian.o cheng.o chu.o
gcc -o /home/zx/lianxi/make/bin/exe test.c -L ../lib/ -l mathb common.h
可执行程序exe完成!

结果

.
|-- bin
| `-- exe
|-- lib
| |-- libmath.a
| `-- libmathb.a
`-- srv
    |-- add.c
    |-- add.o
    |-- cheng.c
    |-- cheng.o
    |-- chu.c
    |-- chu.o
    |-- common.h
    |-- jian.c
    |-- jian.o
    |-- Makefile
    |-- Makefile2
    `-- test.c

代码:
文件:make.tar.gz
大小:4KB
下载:下载
阅读(1391) | 评论(1) | 转发(1) |
给主人留下些什么吧!~~

chinaunix网友2010-10-27 17:45:00

很好的, 收藏了 推荐一个博客,提供很多免费软件编程电子书下载: http://free-ebooks.appspot.com