9.1 Makefile 脚本

一、GCC 指令

1、预处理:gcc -E test.c -o text.i

2、编译:gcc -S test.i -o test.s

3、汇编:gcc -c test.s -o test.o

4、链接:gcc test.o -o test

警告处理:

gcc -w test.c -o test :忽略警告

gcc -wall test.c -o test :编译后显示所有警告

gcc -werror test.c -o test :在产生警告的地方停止编译

二、什么是 Makefile?它的主要作用是什么?

Makefile 是一种用于自动化编译和构建软件的工具,它定义了一系列的规则来指定源文件如何被转换成目标文件。主要作用包括:

  1. 自动化构建:根据依赖关系自动编译需要更新的文件
  2. 管理依赖关系:跟踪源文件之间的依赖,确保正确的编译顺序
  3. 增量编译:只重新编译发生变化的文件,节省编译时间
  4. 定义构建流程:包括预处理、编译、链接等步骤
  5. 提供项目管理:支持多目标构建、条件编译等高级功能

三、基本语法结构

1)规则:定义目标文件、依赖文件和命令。

target: prerequisites  #多个依赖文件之间用空格隔开。
    command

2)变量:存储和重用值

CC = gcc
CFLAGS = -Wall -O2

3)注释:以 # 开头

4)包含:引入其他的 Makefile

include common.mk

5)条件语句:根据条件执行不同的操作

ifeq ifneq ifdef ifndef
ifeq ($(DEBUG), yes)
    CFLAGS += -g
endif

6)函数:内置函数,用于文本处理等

# $(函数名 参数集合)
SRC = $(wildcard *.c)
OBJ = $(patsubst %.c, %.o, $(SRC))

7)自定义函数

# 定义一个生成编译规则的函数
define compile-rule
$(OBJDIR)/$(1)/%.o: $(SRCDIR)/$(1)/%.c
	@mkdir -p $$(dir $$@)
	$(CC) $(CFLAGS) -c $$< -o $$@
endef

# 使用函数
$(foreach dir,core utils net,$(eval $(call compile-rule,$(dir))))

四、自动变量

自动化变量可以不用括号,直接用 $ 引用得到值。

@:表示当前规则的目标文件的完整名称
<:表示当前规则的第一个依赖文件的完整名称
^:表示当前规则的所有依赖文件,去除重复项
+:表示当前规则的所有依赖文件,保留重复项
*:表示当前规则中,目标文件的主文件名(不包括扩展名)
?:代表所有时间戳比目标文件新的依赖文件列表,用空格隔开
$(@D):表示目标文件的目录部分
$(@F):表示目标文件的文件名部分

五、系统预定义变量

CC:C 编译程序,默认是“cc”
CXX:C++ 编译程序,默认是“g++”
CPP:C 程序的预处理器,默认是“$(CC) -E”
RM:删除命令,默认是“rm -f”
CFLAGS:执行 CC 编译器的命令行参数

六、隐式规则

隐式规则是 Makefile 预定义的一些规则,省略某些重复的规则定义,从而简化 Makefile 的编写。

1)常见隐式规则:.c.o、.cpp.o、.S.o

2)自定义规则:使用模式规则

CC = gcc

# 自定义模式规则
%.bar: %.foo
    $(CC) -o $@ $< #命令必须用至少一个制表符开头

# 目标规则
all: test.bar
test.bar: test.foo
# 清理规则
clean: #伪目标没有依赖文件。一个makefile不应只有伪目标,还应有目标,否则make时,伪目标也会执行。
    rm -f *.bar
.PHONY:clean

七、Makefile 如何处理文件依赖关系?如何自动生成依赖?

Makefile 通过规则来定义文件之间的依赖关系。当运行 make 命令时,它会检查目标文件是否存在,以及目标文件的修改时间是否比所有依赖项的修改时间旧。如果目标文件不存在或者某个依赖项的修改时间比目标文件新,make 就会执行规则中的命令来重新生成目标文件。

自动生成依赖:

# 使用GCC的-MM选项生成依赖,-MM 选项会生成不包含系统头文件的依赖信息。
%.d: %.c
    $(CC) -MM $< > $@

# 包含生成的依赖文件  
-include $(SRC:.c=.d)

八、Makefile 中变量的类型有哪些?

变量类型:简单变量(:=):立即展开,在赋值时就已经确定下来,后续不再发生变化;递归变量(=):使用时才展开,动态展开;条件变量(?=):仅在变量未定义时赋值;:向已有变量追加值。

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

C++/嵌入式开发 秋招面经 文章被收录于专栏

一名985硕,在25年秋招中斩获多个C++/嵌入式开发Offer。本专栏将分享我的面经,涵盖C/C++、操作系统、计算机网络、ARM体系与架构、Linux应用/驱动开发、Qt、通信协议及开发工具链等核心内容。

全部评论

相关推荐

第一次面腾讯,真的被压力麻了,没想到会问这么细。面了一个小时,就留10分钟手撕,手撕还是写脚本,最后也没撕出来。大厂的面试官果然专业素质更高,对问题的剖析更加深刻,也算是好好的帮我对项目进行了扫盲。八股1.Ansible中的Paybook&nbsp;结构它主要有这几个核心部分?Roles&nbsp;是怎么划分的?2.K8s&nbsp;集群部署包含哪些组件?3.你了解&nbsp;kube-proxy&nbsp;在这里面的一个作用吗?kube-scheduler呢?项目一1.你提到“设计Node亲和性规则”,那你这里是怎么去设置这个亲和性的呢?2.你的pod你是用的时候是强的还是软的?3.就是说按节点破的密度从&nbsp;15&nbsp;提升到&nbsp;28&nbsp;个,除了那个亲和性,还有哪些去做这个优化呢?4.节点自动扩缩容是自动的吗?5.“解决Kafka在Kubernetes环境中因PVC回收导致的元数据丢失问题”,怎么解决的?6.Rook-Ceph的性能你有没有做过压力测试呢?追问:1.你把1000万的文件去测试,会执行什么命令,表现是什么2.面临这样的大量文件,你有什么优化思路吗7.然后你再运用那个&nbsp;Jenkins&nbsp;的&nbsp;slave&nbsp;port&nbsp;的实现弹性的一个任务执行,这相对那个传统的那个节点的话,就是你这里就是说动,比如说你会动态去拉起一个&nbsp;Pod&nbsp;嘛,对吧?然后在这里面自己执行&nbsp;Docker&nbsp;build&nbsp;的时候,是是这样的一个逻辑吗?那你就是&nbsp;&nbsp;Docker-in-Docker,&nbsp;是这意思吗?8.&nbsp;Docker-in-Docker存在的一些问题9.执行&nbsp;Docker-in-Docker&nbsp;时权限是怎么设置的呢?10.在网络上,跟宿主机会不会有一些冲突的一些问题?11.单次发布时间从&nbsp;40&nbsp;分钟缩短到&nbsp;8&nbsp;分钟,这个除了你的流水线之外,还做了哪些优化?12.当时你的Prometheus&nbsp;&nbsp;是用了什么来做存储的?13.了解Prometheus的数据淘汰吗14.EFK&nbsp;的那个日志采集,用&nbsp;Fluentd&nbsp;&nbsp;做过滤。比如说你的历史就是他是一个文本格式,是怎么去把他那里面的一些正则啊,address&nbsp;的这些变量把它转成&nbsp;json&nbsp;对象呢?15.EFK的日志又存在哪呢16.&nbsp;Fluentd采集完后,你的日志推向哪个组件17.&nbsp;Fluentd采集完后有堆积,哪些参数可以去缓解这个堆积呢?18.然后你在这个项目中,你觉得就说,最复杂的一次排障是什么?就是在你这个项目中。项目二1.第二个项目你就提到那个&nbsp;Nginx&nbsp;&nbsp;做&nbsp;7&nbsp;层的一个负载均衡分摊流量,那你具体这里用的是哪一种方法?2.MySQL&nbsp;主从复制搭建过程中,这个当时是全量数据初始化,还是说是增量呢?3.通过&nbsp;Mycat&nbsp;做读写分离,你这个是怎么去配置的呢?4.那读写分离比如说从库延迟比较大的,那你这个也对读写分离的影响是什么?5.假如mysql出故障了,你是手动切换,还是自动切换6.动态切换,它是基于哪个指标来做判断?7.你说你直接把从库宕机掉,当时挂掉之后再重新接上,怎么做数据恢复?8.数据恢复的时候从库如何命中到之前断开的位置9.Redis&nbsp;做session共享时需要配置哪些具体的参数呢?10.然后这里还有个是&nbsp;Mango&nbsp;DB&nbsp;存放日志,它是由&nbsp;Nginx&nbsp;&nbsp;直接写呢?还是说是在哪里写入的?11.那你说一下它整个过程是怎么样的?从&nbsp;Nginx&nbsp;&nbsp;产生日志到&nbsp;Mango,&nbsp;当时你们是怎么做的?
发面经攒人品
点赞 评论 收藏
分享
方向不合适,面试官也没怎么问1.&nbsp;自我介绍2.&nbsp;我看你的简历以后端开发为主,你了解我们这个岗位的情况吗?3.&nbsp;讲一下你做的项目怎么部署的4.&nbsp;你本地部署的环境是什么5.&nbsp;linux这一块你熟悉吗?就是操作系统相关的东西6.&nbsp;网络这一块你了解多少?7.&nbsp;tcp、https握手挥手你了解多少?8.&nbsp;我看你有个agent项目,你对agent和大模型了解多少9.&nbsp;手撕两道题目(都不会)1.&nbsp;一个数组,可以按照任意顺序把里面的数字拼起来得到一个数字,需要让最终结果尽可能大2.&nbsp;用熟悉的语言获取网卡信息(比如网卡型号、最大网速啥的),然后按照指定格式打印10.&nbsp;你的职业规划是什么11.&nbsp;反问:组里大概做什么-&nbsp;阿里边缘云相关。两大产品CDN和SDN。我们团队以运营为主,主要是用工程能力做一些稳定性工作。-&nbsp;40%精力做一些基础工作,比如日常告警规则的指定,售后相关、交付工作比如任务部署到边缘-&nbsp;60%经历围绕效率和稳定性展开-&nbsp;30%做一些ai提效工具,智能运维啥的-&nbsp;30%横向相关,跨团队合作、值班、工单等12.&nbsp;你怎么看这个工作,有意向吗?(感觉方向不合适,容器、虚拟化啥的我也不会,感觉不太合适,拒绝了)13.&nbsp;最后面试官说今年是ai落地元年,大家都在往这里转,阿里里面基本上vibe&nbsp;coding为主,你可以多关注ai一下,无论什么方向
查看11道真题和解析
点赞 评论 收藏
分享
评论
4
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务