如何编写一个简单的makefile

一个规则的构成

目标:依赖1,依赖2······

       命令

例子:

objs := init.o nand.o head.o  main.o

nand.bin : $(objs)
    arm-linux-ld -Tnand.lds -o nand_elf $^
    arm-linux-objcopy -O binary -S nand_elf $@
    arm-linux-objdump -D -m arm  nand_elf > nand.dis 

%.o:%.c
    arm-linux-gcc -Wall -c -O2 -o $@ $<

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

clean:
    rm -f  nand.dis nand.bin nand_elf *.o

解释:

(1)objs变量可以起到“宏”的作用,引用变量时,用$(objs)。

(2)最终目标为nand.bin,它的依赖为init.o nand.o head.o  main.o。

(3)表示把所有的c语言文件用arm-linux-gcc生成对应的o文件。

%.o:%.c
       arm-linux-gcc -Wall -c -O2 -o  $@  $<

(4)表示把所有的s语言文件用arm-linux-gcc生成对应的o文件。

%.o:%.s
       arm-linux-gcc -Wall -c -O2 -o $@ $<

(5)表示arm-linux-ld以链接脚本nand.lds为规则,将init.o nand.o head.o  main.o链接生成一个nand_elf的文件。

arm-linux-ld -Tnand.lds -o nand_elf $^ 

(6)表示将nand_elf文件转换成bin文件。

arm-linux-objcopy -O binary -S nand_elf $@ 

(7)表示将nand_elf转换生成nand.dis的反汇编文件。

arm-linux-objdump -D -m arm  nand_elf > nand.dis

其中:

$^ 所有依赖目标的集合

$@ 规则中的目标文件集

$< 依赖中第一个目标的名字。 

Makefile是一种在Unix/Linux系统中广泛使用的自动化构建工具文件,它通过简单的规则描述了源代码文件之间的依赖关系,指定了编译、链接等操作的命令。下面是创建一个基本Makefile的基本步骤: 1. **初始化**:首先,创建一个名为`Makefile`的文本文件。通常放在项目的根目录下。 2. **变量设置**:定义一些全局变量,如`CC` (C/C++ 编译器),`CFLAGS` (编译选项) 和 `TARGET`(最终目标文件名)。 ```makefile CC = gcc CFLAGS = -Wall -g TARGET = my_program ``` 3. **规则定义**:这部分包含了一系列的规则,每个规则由指令(recipe)和目标(target)组成。例如,一个简单的"compile"规则可能如下: ```makefile %.o: %.c $(CC) $(CFLAGS) -c $< -o $@ ``` 这条规则表示所有`.c`源文件编译成对应的`.o`对象文件。 4. **目标规则**:定义项目的主目标,比如编译、链接和清理等。 - `all`: 定义项目的默认目标,通常是编译链接所有的源文件。 ```makefile all: $(TARGET) $(TARGET): %.out: %.o $(CC) $(CFLAGS) -o $@ $^ ``` `-o`指定输出的目标文件名。 5. **清理规则**:`clean` 或 `distclean` 目标用于清除临时文件和更复杂的项目垃圾。 ```makefile clean: rm -f *.o $(TARGET) core distclean: clean rm -rf *.log *.aux *.dvi ``` 6. **运行规则**:如果你的应用需要其他命令来启动,可以添加`run`规则。 7. **结束标志**:最后,在Makefile的末尾加上`.PHONY`,标记那些不是真实存在的文件但需要特殊处理的规则,如`all`, `clean`。 记得保存文件后,通过运行`make`命令,Makefile就会根据规则执行应的任务。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值