Linux第65步_学习“Makefie”

1、在"/home/zgq/linux/"创建一个"Test_MakeFile"目录用于学习"Makefie"。

打开终端

输入"cd /home/zgq/linux/回车",切换到"/home/zgq/linux/"目录

输入"mkdir Linux_Drivers回车",创建"Linux_Drivers"目录

输入"cd Linux_Drivers回车"

切换到"/home/zgq/linux/Linux_Drivers/"目录

输入"mkdir TestMakeFile回车",创建"TestMakeFile"目录

输入"cd TestMakeFile回车"

切换到"/home/zgq/linux/Linux_Drivers/TestMakeFile"目录

2、输入"vim main.c回车"

输入内容如下:

#include <stdio.h>

#include "Output.h"

int main(int argc, char *argv[])

{

printf("Hello main.c!\r\n");

My_Output();

}

输入"vim Output.c回车"

#include "Output.h"

#include <stdio.h>

///函数声明开始//

void My_Output(void);

///函数声明结束//

void My_Output(void)

{

printf("Hello Output.c!\r\n");

}

输入"vim Output.h回车"

#ifndef _OUTPUT_H

#define _OUTPUT_H

extern void My_Output(void);

#endif

3、输入"vim Makefie回车"

输入内容如下:

main: main.o Output.o

#生成"main"需要依赖"main.o和Output.o"

gcc -o main main.o Output.o

#将"main.o和Output.o"编译输出main

@echo Output main

#只输出Output main

main.o: main.c

gcc -c main.c

#编译"main.c"生成"main.o"

Output.o: Output.c

gcc -c Output.c

#编译"Output.c"生成"Output.o"

clean:

#生成"clean"目标不依赖任何文件

rm *.o

#删除所有后缀为".o"的文件

rm main

#删除"main"这个可执行文件

@echo Clear *.o and main

#只输出Clear *.o and main

见下图:

改写Makefile,内容如下

objects = main.o Output.o

#将"main.o Output.o"的字符串赋值给objects

main: $(objects)

#$(objects)引用objects的值"main.o Output.o"

#生成"main"需要依赖"objects的值"

gcc -o main $(objects)

#$(objects)引用objects的值"main.o Output.o"

#将"main.o Output.o"编译输出main

@echo Output main

#只输出Output main

%.o : %.c

gcc -c $<

#依赖文件是以"%.c"定义的,所以"$<"表示所有".c"文件的集合

#将main.c和Output.c编译生成"main.o和Output.o"

clean:

#生成"clean"目标不依赖任何文件

rm *.o

#删除所有后缀为".o"的文件

rm main

#删除"main"这个可执行文件

@echo Clear *.o and main

#只输出Clear *.o and main

4、编译

打开终端

输入"make回车"执行编译

输入"ls回车",查看"/home/zgq/linux/Linux_Drivers/TestMakeFile"目录下的所有文件和文件夹

输入"./main回车",运行main.exe

输入"make clean回车"清除工程

输入"ls回车",查看"/home/zgq/linux/Linux_Drivers/TestMakeFile"目录下的所有文件和文件夹

输入"make clean回车"执行编译

输入"ls回车",查看"/home/zgq/linux/Linux_Drivers/TestMakeFile"目录下的所有文件和文件夹

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"文件;

注意:

需要"依赖文件的目标名"都是要生成文件。

目标名不需要依赖文件,是伪目标,也可以使用".PHONY : XXX"将"XXX"目标名指定为伪目标。

举例Makefile文件如下:

objects = main.o Output.o

#将"main.o Output.o"的字符串赋值给objects

main: $(objects)

#$(objects)引用objects的值"main.o Output.o"

#生成"main"需要依赖"objects的值"

gcc -o main $(objects)

#$(objects)引用objects的值"main.o Output.o"

#将"main.o Output.o"编译输出main

@echo Output main

#只输出Output main

.PHONY : clean

#声明 clean为伪目标

%.o : %.c

gcc -c $<

#依赖文件是以"%.c"定义的,所以"$<"表示所有".c"文件的集合

#将main.c和Output.c编译生成"main.o和Output.o"

MyPrint:

@echo Do MyPrint

#只输出Do MyPrint

clean:

#生成"clean"目标不依赖任何文件

rm *.o

#删除所有后缀为".o"的文件

rm main

#删除"main"这个可执行文件

@echo Clear *.o and main

#只输出Clear *.o and main

10)、按"TAB键"后,输入的是"命令",它用来创建"Shell进程";

11)、Makefle代码中"行首需要空出",必须使用"TAB键",不能使用"空格键";

12)、当"%"出现在"目标名"中的时候,则目标名中"%所代表的值"取决于依赖文件中的"%"值

%.o : %.c #所有以".c"结束的文件,目标名中的"%.o"的"%"和所有以".c"结束的文件名保持一致。

这个用法,参考前面改写Makefile的介绍。

相关推荐
此生只爱蛋25 分钟前
【Linux】正/反向代理
linux·运维·服务器
qq_54702617931 分钟前
Linux 基础
linux·运维·arm开发
yuhaiqun198933 分钟前
Typora 技能进阶:从会写 Markdown 到玩转配置 + 插件高效学习笔记
经验分享·笔记·python·学习·学习方法·ai编程·markdown
zfj32137 分钟前
sshd除了远程shell外还有哪些功能
linux·ssh·sftp·shell
我只会发热1 小时前
Ubuntu 20.04.6 根目录扩容(图文详解)
linux·运维·ubuntu
宝宝单机sop1 小时前
产品经理资源合集
经验分享
爱潜水的小L1 小时前
自学嵌入式day34,ipc进程间通信
linux·运维·服务器
保持低旋律节奏1 小时前
linux——进程状态
android·linux·php
zhuzewennamoamtf1 小时前
Linux I2C设备驱动
linux·运维·服务器
我命由我123451 小时前
Python Flask 开发问题:ImportError: cannot import name ‘Markup‘ from ‘flask‘
开发语言·后端·python·学习·flask·学习方法·python3.11