学习“Makefie”,为后期学习linux驱动开发做铺垫。
1、在“/home/zgq/linux/atk-mp1”创建一个“Test_MakeFile”目录用于学习“Makefie”。
打开终端
输入“cd /home/zgq/linux/回车”,切换到“/home/zgq/linux/”目录
输入“mkdir Linux_Drivers回车”,创建“Linux_Drivers”目录
输入“cd Linux_Drivers回车”
切换到“/home/zgq/linux/Linux_Drivers/”目录
输入“mkdir TetsMakeFile回车”,创建“TetsMakeFile”目录
输入“cd TestMakeFile回车”
切换到“/home/zgq/linux/Linux_Drivers/TestMakeFile”目录
2、输入“vim main.c回车”
输入内容如下:
#include <stdio.h>
int main(int argc, char *argv[])
{
printf("Hello World!\n");
}
3、输入“vim Makefie回车”
输入内容如下:
main: main.o
#生成“main”需要依赖“main.o”
gcc -o main main.o
#将“main.o”编译输出main.exe
@echo Output main.exe
#只输出Output main.exe
main.o: main.c
#生成“main.o”需要依赖“main.c”
gcc -c main.c
#编译“main.c”
clean:
#生成“clean”目标不依赖任何文件
rm *.o
#删除所有后缀为“.o”的文件
rm main
#删除“main”这个可执行文件
@echo Clear *.o and main.exe
#只输出Clear *.o and main.exe
见下图:
4、编译
打开终端
输入“make回车”执行编译
输入“ls回车”,查看“/home/zgq/linux/Linux_Drivers/TetsMakeFile”目录下的所有文件和文件夹
输入“./main回车”,运行main.exe
输入“make clean回车”清除工程
输入“ls回车”,查看“/home/zgq/linux/Linux_Drivers/TetsMakeFile”目录下的所有文件和文件夹
Makefie文件和C文件是位于同一个目录中,才可以使用这个“Makefile”。
1)、Makefle 中的“注释开头”要用符号“#”开头,不能使用C语言中的“//”和“/* */”。注意:“#”要顶格输入,否则会被当作一条语句;
2)、Makefile输出字符串使用“echo”
比如:
Print:
#必须以标号开始,否则不能用
@echo name
#只输出name
输入“make回车”
3)、Makefile中的变量值是字符串,比如:objects = XXX.o,表示objects的值是字符串“XXX.o”;
4)、Makefile中变量定义:变量名 = xx,比如:objects = XXX.o,表示objects的值是字符串“XXX.o”;
5)、Makefile中引用变量的方法是“$(变量名)”,比如:$(objects)就表示引用了objects变量。
6)、赋值符“:=”不会使用后面定义的变量,赋值符“=”会使用后面定义的变量。
举例如下:
name1 = V1
#给变量name1赋值为“V1”
name2 := $(name1)
#给变量name2赋值为“V1”,它引用了name1变量
name3 = $(name1)
#给变量name3赋值为“V1”,它引用了name1变量
name1 = V2
#给变量name1赋值为“V2”
#由于name2使用的赋值符为“:=”,所以name2的值保持不变
#由于name3使用的赋值符为“=”,所以name3变成了“V2”
print:
@echo name3 = $(name3)
@echo name2 = $(name2)
@echo name1 = $(name1)
输入“make回车”
见下图:
7)、赋值符“?=”
name1 = V1
#给变量name1赋值为“V1”
name2 = V2
#给变量name2赋值为“V2”
name1 ?= V3
#由于变量name1被赋值了,所以name1的值还是“V1”
name3 ?= V4
#由于变量name3没有被赋值,所以name3的值是“V4”
print:
@echo name3 = $(name3)
@echo name2 = $(name2)
@echo name1 = $(name1)
输入“make回车”
8)、变量追加“+=”
objects = main.o inpiut.o
#将字符串“main.o inpiut.o”赋值给变量objects
objects += calcu.o
#将字符串“main.o inpiut.o calcu.o”赋值给变量objects
print:
@echo objects = $(objects)
输入“make回车”
9)、目标名: 依赖文件,比如:“main: main.o input.o”,表示目标名main需要依赖“main.o input.o”文件;
10)、按“TAB键”后,输入的是“命令”,它用来创建“Shell进程”;
11)、Makefle代码中“行首需要空出”,必须使用“TAB键”,不能使用“空格键”;
12)、当“%”出现在“目标名”中的时候,则目标名中“%所代表的值”取决于依赖文件中的“%”值
%.o : %.c #所有以“.c”结束的文件,目标名中的“%.o”的“%”和所有以“.c”结束的文件名保持一致。
假如存在main1.c和main2.c,则“%.o : %.c”表示的意思如下:
main1 : main1.c
main2 : main2.c
举例:
输入“vim main.c回车”
输入内容如下:
#include <stdio.h>
int main(int argc, char *argv[])
{
printf("Hello World!\n");
}
输入“vim Makefile回车”
main: main.o
#生成“main”需要依赖“main.o”
gcc -o main main.o
#将“main.o”编译输出main.exe
@echo Output main.exe
#只输出Output main.exe
%.o: %.c
#目标名中的“%.o”的“%”和所有以“.c”结束的文件名保持一致。因为只有一个main.c,所以表示“main.o: main.c”
gcc -c main.c
#编译“main.c”
clean:
#生成“clean”目标不依赖任何文件
rm *.o
#删除所有后缀为“.o”的文件
rm main
#删除“main”这个可执行文件
@echo Clear *.o and main.exe
#只输出Clear *.o and main.exe
输出“make回车”