目标
- 一、网络基础及相关命令
- 二、Makefile
-
- (一)标签式语法
- [(二)目标:依赖 式语法](#(二)目标:依赖 式语法)
-
- [1. 格式](#1. 格式)
- [2. 编译流程:预处理 编译 汇编 链接](#2. 编译流程:预处理 编译 汇编 链接)
- [3. 目标和伪目标](#3. 目标和伪目标)
- [4. 使用实例](#4. 使用实例)
- (三)makefile中的变量
-
- [1. 格式](#1. 格式)
- [2. 赋值](#2. 赋值)
- [3. 使用实例](#3. 使用实例)
- (四)Makefile中的特殊变量
- (五)Makefile中的通配符
- (六)Makefile中包含其他.mk文件
一、网络基础及相关命令
(一)网络相关命令
查看网络信息的命令
linux ifconfig
win ipconfig
查看网络是否连通
ping www.baidu.com
(二)重启网络服务
Ubuntu中如果网络服务器异常,可以按下面的流程操作一下:
bash
sudo service network-manager stop #停止网络服务
sudo vi /etc/NetworkManager/NetworkManager.conf #打开配置文件
managed=true #将managed=false 改成 managed=true 保存退出
sudo root #切换到root用户
sudo rm /var/lib/NetworkManager/NetworkManager.state #删除原来保存的状态信息
exit #回到原用户
sudo service network-manager start #重新启动网络服务
二、Makefile
Makefile是一个文件,里面存放整个项目的编译 规则
Makefile可以根据文件时间戳来决定那些文件需要重新编译,从而提高编译的效率
makefile文件一般与.c文件一起放在src(源程序)文件夹中
(一)标签式语法
bash
标签1:
指令1
指令2
标签2:
指令3
指令4
- 注:
- 标签必须顶满格
- 指令必须以
tab
开头(四个空格不可以) - 一个makefile文件可以有多个标签
- 一个标签下可以有多条指令
如果自己写的makefile名字不叫 Makefile 或者 makefile ,可以使用make -f filename
的方式来指定解析的Makefile文件
如果直接make,执行的就是第一个标签下的指令
如果想指定执行哪个标签下的指令 可以使用make 标签名
方式
(二)目标:依赖 式语法
1. 格式
bash
目标:依赖
指令
- 注:
- 目标:依赖 必须顶满格
- 指令必须以
tab
开头(四个空格不可以)
2. 编译流程:预处理 编译 汇编 链接
bash
a.out:test.o
gcc test.o -o a.out
test.o:test.s
gcc -c test.s -o test.o
test.s:test.i
gcc -S test.i -o test.s
test.i:test.c
gcc -E test.c -o test.i
make在解析makefile文件时会自动进行推导
所以最终执行顺序:
bash
gcc -E test.c -o test.i #预处理
gcc -S test.i -o test.s #编译
gcc -c test.s -o test.o #汇编
gcc test.o -o a.out #链接
3. 目标和伪目标
makefile中的目标又分为目标和伪目标
目标:编译后会生成目标文件
伪目标:指令会执行,但是没有目标文件产生。如:clean
4. 使用实例
指令前加@,取消指令回显
#Makefile中使用#来注释,只有单行注释
eg: 使用目标:依赖方式,Makefile1
bash
app:main.o hqyj1.o hqyj2.o hqyj3.o
gcc main.o hqyj1.o hqyj2.o hqyj3.o -o app
main.o:main.c
gcc -I ../include main.c -c -o main.o
hqyj1.o:hqyj1.c
gcc -I ../include hqyj1.c -c -o hqyj1.o
hqyj2.o:hqyj2.c
gcc -I ../include hqyj2.c -c -o hqyj2.o
hqyj3.o:hqyj3.c
gcc -I ../include hqyj3.c -c -o hqyj3.o
clean:
rm main.o hqyj1.o hqyj2.o hqyj3.o app
-I
指定头文件路径,如果在系统路径中没找到,会到该路径下寻找
(三)makefile中的变量
1. 格式
与shell中类似,一般makefile中的变量也大写
定义变量:VALUE=hello
引用变量:$(VALUE)
或者 ${VALUE}
2. 赋值
(1)=
赋值
会将所有给变量复制的位置都找到,将最后一次的结果赋值给变量
bash
A=10
B=${A}
A=20
all:
@echo ${B} #B=20
(2):=
立即赋值
会将变量当前的值赋值给变量
bash
A=10
B:=${A}
A=20
all:
@echo ${B} #B=10
(3)+=
追加赋值
bash
A=hello
B=world
A+=${B}
all:
@echo ${A} #hello world
(4)?=
询问赋值
如果变量之前没有被赋值过,本次赋值生效
如果之前已经赋值过了,本次赋值不生效
bash
A=10
A?=20
all:
@echo ${A} #A=10
3. 使用实例
eg:引入变量,Makefile2:
bash
TARGET=app
OBJ=main.o hqyj1.o hqyj2.o hqyj3.o
CC=gcc
INCLUDE=-I ../include
FLAG=-c -o
$(TARGET):$(OBJ)
$(CC) $(OBJ) -o $(TARGET)
main.o:main.c
$(CC) $(INCLUDE) main.c $(FLAG) main.o
hqyj1.o:hqyj1.c
$(CC) $(INCLUDE) hqyj1.c $(FLAG) hqyj1.o
hqyj2.o:hqyj2.c
$(CC) $(INCLUDE) hqyj2.c $(FLAG) hqyj2.o
hqyj3.o:hqyj3.c
$(CC) $(INCLUDE) hqyj3.c $(FLAG) hqyj3.o
clean:
rm $(OBJ) $(TARGET)
(四)Makefile中的特殊变量
是针对于每条 目标:依赖 语句
$@
目标文件
$^
所有的依赖文件
$<
第一个依赖文件
eg:引入特殊变量
bash
TARGET=app
OBJ=main.o hqyj1.o hqyj2.o hqyj3.o
CC=gcc
INCLUDE=-I ../include
FLAG=-c -o
$(TARGET):$(OBJ)
$(CC) $(OBJ) -o $(TARGET)
main.o:main.c
$(CC) $(INCLUDE) $< $(FLAG) $@
hqyj1.o:hqyj1.c
$(CC) $(INCLUDE) $< $(FLAG) $@
hqyj2.o:hqyj2.c
$(CC) $(INCLUDE) $< $(FLAG) $@
hqyj3.o:hqyj3.c
$(CC) $(INCLUDE) $< $(FLAG) $@
clean:
rm $(OBJ) $(TARGET)
(五)Makefile中的通配符
*
:在Makefile中执行shell命令时的通配符,通配任意长度的任意字符
bash
LIST=$(shell ls *.c)
all:
@echo $(LIST)
%
:在Makefile中的通配符,通配任意长度的任意字符
eg:引入通配符
bash
TARGET=app
OBJ=main.o hqyj1.o hqyj2.o hqyj3.o
CC=gcc
INCLUDE=-I ../include
FLAG=-c -o
$(TARGET):$(OBJ)
$(CC) $(OBJ) -o $(TARGET)
%.o:%.c
$(CC) $(INCLUDE) $< $(FLAG) $@
clean:
rm $(OBJ) $(TARGET)
(六)Makefile中包含其他.mk文件
-include ../config.mk
- 注:
- 通过"
-
"来包含其他".mk
"文件 - 包含的文件无需双引号
eg:包含其他.mk文件
bash
-include ../config.mk
$(TARGET):$(OBJ)
$(CC) $^ -o $@
%.o:%.c
$(CC) $(INCLUDE) $< $(FLAG) $@
clean:
rm $(OBJ) $(TARGET)