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)
相关推荐
Dangks3 天前
[运维] 服务器本地网络可用性检查脚本
linux·运维·服务器·shell·network·系统工具
DreamADream4 天前
Shell编程中关于用户操作报错`用户无法登录`
shell
江上清风山间明月7 天前
shell脚本编写注意细节 ==、=等的区别
bash·shell·注意·相等·细节·==·=
188_djh12 天前
# linux从入门到精通-从基础学起,逐步提升,探索linux奥秘(十六)--shell
linux·运维·bash·shell·shell入门·shell变量·linux入门到精通
RamboPan12 天前
Mac 使用脚本批量导入 Apple 歌曲
macos·自动化·shell·apple·script
I'm Jie13 天前
一站式学习 Shell 脚本语法与编程技巧,踏出自动化的第一步
linux·ssh·shell·shell脚本·shell编程
rainsc15 天前
当多核变单核:破解CPU核心神秘失踪的终极指南!
服务器·shell
一丝晨光16 天前
编程语言支持中文变量吗?三字符组是什么来源?为什么结构体要考虑对齐?如何确定语言使用的地址是不是物理地址?用户态应用程序如何获取变量的物理地址?
java·linux·c++·c·shell·结构体·虚拟地址
188_djh16 天前
# linux从入门到精通-从基础学起,逐步提升,探索linux奥秘(十七)--shell运算符
linux·运维·bash·shell·shell脚本附带参数·shell运算符·shell文件测试运算符
咖啡调调。17 天前
⑤sed流编辑器与awk文本处理工具——项目实训任务
编辑器·shell·脚本