Chinaunix首页 | 论坛 | 博客
  • 博客访问: 251548
  • 博文数量: 52
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1538
  • 用 户 组: 普通用户
  • 注册时间: 2013-04-24 07:45
个人简介

生活就像海洋,只有意志坚强的人,才能到达彼岸。

文章存档

2013年(52)

分类: LINUX

2013-09-13 11:40:48

一、为什么需要Makefile?

    使用GNU Make工具管理程序是每个Linux工程师必须掌握的技能。Make能够是整个程序的编译、链接只需要一个命令(make)就可以完成。Make的工作主要依赖一个叫为Makefile的文件。Makefile文件描述了整个程序的编译,链接等规则。其中包括:工程中的哪些文件需要编译以及如何编译,如何最后产生我们需要的可执行文件。

二、Makefile构成:

1、规则

    Makefile中最重要的组成部分是“规则”

    规则:用于说明如何产生目标文件,规则的格式如下:

targets prerequisites
    command

目标 依赖 命令

特别提示:命令需要使用【Tab】键空格

led.bin : led.o
    arm-linux-ld -Tled.lds -o led.elf led.o


2、伪目标

    Makefile中把那些只包含命令,没有任何依赖的目标称为“伪目标”(phony targets).

.PHONY : clean
clean:
    rm -f hello main.o func

".PHONY"将"clean"目标声明为伪目标

3、最终目标

    1>当一个makefile中有多条规则时,如何单独执行某条规则?

    2>如果用户没有指定执行某一条规则,make会默认执行makefile中的第一条规则,而这条规则中的目标称之为:最终目标 

all : led.o
    arm-linux-ld -Tled.lds -o led.elf led.o
    arm-linux-objcopy -O binary led.elf led.bin

4、变量

使用变量前

app1: app1.o func1.o func2.o
    `gcc app1.o func1.o func2.o -o app1

app2: app2.o func1.o func2.o
    `gcc app2.o func1.o func2.o -o app2

使用变量后

obj=func1.o func2.o
app1: app1.o $(obj)
    gcc app1.o $(obj) -o app1

app2: app2.o $(obj)
    gcc app2.o $(obj) -o app2

在Makefile中,用户除了可以自己定义变量外,还可以使用存在系统已经定义好的默认变量

$^: 代表所有依赖文件

$@: 代表目标

$<: 代表第一个依赖文件

使用前

led.o : led.S
    arm-linux-gcc -g -o led.o -c led.S

使用后

led.o :led.S
    arm-linux-gcc -g -o $@ -c $^


5、通用规则

    当一个makefile中有许多类似的规则时,如何将这些规则合并为一条通用规则?

%.o : %.S
arm-linux-gcc -g -o $@ $< -c

6、使用技巧

1>去回显:

Makefile中"#"字符后的内容被视作注释。

hello: hello.c
    @gcc hello.c -o hello

@:取消回显

2>修改makefile名:

make命令默认在当前目录下寻找名字为makefile或Makefile的工程文件,当名字不为这两者之一时,可以使用如下方法指定:

make -f 文件名
阅读(1921) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~