SHELL编程(三)网络基础命令 Makefile

目标

一、网络基础及相关命令

(一)网络相关命令

查看网络信息的命令

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)
相关推荐
酥心糖小可爱2 天前
shell脚本案例
shell·脚本
桃酥4036 天前
GCC实用干货
linux·shell·gcc
却道天凉_好个秋9 天前
c++ CMakeLists.txt详解
c++·makefile·cmakelists.txt
月光技术杂谈11 天前
5G模组AT命令脚本-命令发送及回显读取
linux·5g·shell·5g模组·5g终端·at命令
都小事儿13 天前
爽解报错:/bin/bash^M: bad interpreter: No such file or directory
linux·bash·shell
彷徨而立14 天前
【Makefile】编译日志之输出重定向符号 >
makefile
Mr.朱鹏17 天前
shell脚本实战案例
java·spring boot·spring·java-ee·kafka·maven·shell
laoyouzhazi18 天前
Ubuntu ufw + Python3 add / remove port-rule
linux·ubuntu·shell·防火墙·python3·ufw
冷心笑看丽美人21 天前
SHELL脚本初体验(Linux网络服务器 22)
linux·服务器·shell·redhat
suwith23 天前
通过shell脚本分析部署nginx网络服务
shell