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

一、网络基础及相关命令

(一)网络相关命令

查看网络信息的命令
linux ifconfig
win ipconfig
查看网络是否连通
ping www.baidu.com

(二)重启网络服务

Ubuntu中如果网络服务器异常,可以按下面的流程操作一下:

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(源程序)文件夹中

(一)标签式语法

标签1:     
    指令1  
    指令2  
标签2:     
    指令3
    指令4
  • 注:
  • 标签必须顶满格
  • 指令必须以tab开头(四个空格不可以)
  • 一个makefile文件可以有多个标签
  • 一个标签下可以有多条指令

如果自己写的makefile名字不叫 Makefile 或者 makefile ,可以使用make -f filename 的方式来指定解析的Makefile文件

如果直接make,执行的就是第一个标签下的指令
如果想指定执行哪个标签下的指令 可以使用make 标签名方式

(二)目标:依赖 式语法

1. 格式

目标:依赖  
    指令  
  • 注:
  • 目标:依赖 必须顶满格
  • 指令必须以tab开头(四个空格不可以)

2. 编译流程:预处理 编译 汇编 链接

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文件时会自动进行推导
所以最终执行顺序:

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

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)=赋值

会将所有给变量复制的位置都找到,将最后一次的结果赋值给变量

A=10
B=${A}
A=20
all:
	@echo ${B}  #B=20
(2):=立即赋值

会将变量当前的值赋值给变量

A=10
B:=${A}
A=20
all:
	@echo ${B}  #B=10
(3)+=追加赋值
A=hello
B=world
A+=${B}
all:
	@echo ${A}  #hello world
(4)?=询问赋值

如果变量之前没有被赋值过,本次赋值生效
如果之前已经赋值过了,本次赋值不生效

A=10
A?=20
all:
	@echo ${A}  #A=10

3. 使用实例

eg:引入变量,Makefile2:

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:引入特殊变量

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命令时的通配符,通配任意长度的任意字符

LIST=$(shell ls *.c)
all:
	@echo $(LIST)

%:在Makefile中的通配符,通配任意长度的任意字符

eg:引入通配符

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

-include ../config.mk

$(TARGET):$(OBJ)
	$(CC) $^ -o $@
%.o:%.c
	$(CC) $(INCLUDE) $< $(FLAG) $@

clean:
	rm $(OBJ) $(TARGET)
  • 27
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值