Make的工作主要依赖于一个叫Makefile的文件。Makefile文件描述了整个程序的编译、链接等规则。

1 make命令

1.1、make命令的选项和参数

-k:作用是让make命令在发现错误时仍然继续执行。可以利用这个选项在一次操作中发现所有未编译成功的源文件。

-n:作用是让make命令输出将要执行的操作步骤,而不真正执行这些操作。

-f <filename>:作用是告诉make命令将哪个文件作为nakefile文件。如果未使用这个选项,标准版的make命令将首先在当前目录下查找名为makefile文件,如果没有,就会查找名为Makefile的文件。

1.2 make规则

  所有行开头的空格必须是TAB,所有行结尾不允许有空格

2 Makefile

2.1、Makefile格式

目标 : 依赖文件合集......
  命令1
  命令2
  ......

例:

main : main.o input.o calcu.o
  gcc -o main main.o input.o calcu.o

2、Makefile构成-伪目标

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

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

3、 Makefile构成-最终目标

  1. Make led.o //在Makefile查找目标为led.o的规则并执行。
  2. Make //默认执行第一条规则,第一条规则的依赖文件找不到的话,自动执行目标文件为第一条规则的依赖文件的规则。
  3. 用户自定义的变量

4、Makefile构成-自定义变量

使用变量前:

app1: app1.o func1.o func2.o -o app1
    gcc app1.o func1.o func2.o -o app1
app2: app2.o func1.o func2.o -o app2
    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中变量的引用方法是 “$(变量名)”,

比如本例中的“$(obj)”。

5、系统定义好的变量

$^:代表所有的依赖文件

$@:代表目标

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

使用前:

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

使用后:

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

6、Makefile构成-通配符

%.o //表示所有以.o结尾的文件

%.c //表示所有以.c结尾的文件

%.s //表示所有以.s结尾的文件

  ……

1.1.6. Makefile使用技巧

  1. 注释:“#注释内容”
  2. 去回显:命令前加“@”

1.1. 链接器脚本 

SECTION{
. = 0x30000000   # .是指当前地址,在此处设置起始链接地址为0x30000000

. = ALING(4);   #设置4字节对齐
    .text:     #代码段
    {
    start.o(.text) #代码段0地址执行的程序名
    *(.text)
    }

. = ALING(4)     #设置4字节对齐
    .data:       #数据段
    {
    *(.data)
    }

    . = ALING(4)     #设置4字节对齐
    bss_start = .;   #定义变量=当前位置地址
    .bss:       #BSS段
    {
    *(.bss)
    }
    bss_end = .; 定义变量=当前位置地址
}