Linux C/C++编程之(十二)makefile项目管理

一、概述

在这里插入图片描述

二、编写

1)文件的命名规则

  • makefile
  • Makefile

2)用途

  • 项目代码编译管理
  • 节省编译项目的时间
  • 一次编写终身受益

3)基本规则

在这里插入图片描述

目标:依赖
(tab)命令
  • 目标 -->要生成的目标文件
  • 依赖 -->生成目标文件需要的一些文件
  • 命令 -->借助依赖文件生成目标文件的手段
  • tab -->缩进,有且只有一个

在这里插入图片描述
Makefile会把规则中的第一个目标作为终极目标

  • all:app -->all指定生成的最终目标为app

4)工作原理

在这里插入图片描述

  • 若想生成目标,检查规则中的依赖条件是否存在,如果不存在,寻找是否有规则用来生成该依赖文件
  • 检查规则中的目标是否需要更新,必须检查它的所有依赖,依赖中有任意一个被更新,则目标必须更新
    • 依赖文件比目标文件时间晚,则需要更新

5)执行

  • make -->通过 makefile 生成目标文件
    • 直接 make(使用 makefile 文件)
    • make -f mm(指定一个名字不为 makefile 的文件)
  • make clean -->清除编译生成的中间 .o 文件和最终目标文件
    • 如果当前目录下有同名 clean 文件,则不执行 clean 对应的命令
      • 解决方案 -->伪目标声明。如:.PHONY:clean
    • 特殊符号
      • -:表示此条命令出错,make 也会继续执行后续的命令。如:-rm a.o b.o

6)变量

  • 普通变量
    • 变量定义及赋值:obj=a.o b.o c.o
    • 变量取值:foo=$(obj)
    • 由 Makefile 维护的一些变量
      • 通常格式都是大写
        • CC:默认值cc
      • 有些有默认值,有些没有
        • CPPFLAGS:预处理器需要的选项 如:-I
        • CFLAGS:编译的时候使用的参数 -Wall -g -c
        • LDFLAGS:链接库使用的选项 -L -I
      • 用户可以修改这些变量的默认值
        • CC=gcc
  • 自动变量
    • 变量
      • $@ -->规则中的目标
      • $< -->规则中的第一个依赖条件
      • $^ -->规则中的所有依赖条件
    • 模式规则
      • 在规则的目标定义中使用%
      • 在规则的依赖条件中使用%
      • 实例:(%表示一个或多个)
        •   %.o:%.c
            			$(CC) -c $< -o $@
          
        • $< -->表示依次取出依赖条件
        • $@ -->表示依次取出目标值

7)函数

  • makefile中所有的函数必须都有返回值
  • wildcard
    • 查找指定目录下指定类型的文件,一个参数
    •   src=$(wildcard ./src/*.c)
      
    • 找到 ./src 目录下所有后缀为 .c 的文件,赋给变量 src
  • patsubst
    • 匹配替换,从 sec 中找到所有 .c 结尾的文件,并将其替换为 .o
    •   obj=$(patsubst %.c,%.o,%(src))
      
      • 把 src 变量中所有后缀为 .c 的文件替换成 .o
    •   ob=$(patsubst ./src/%.c,./obj/%.o,%(src))
      
      • 指定 .o 文件存放的路径 ./obj/%.o

三、实操

第一版makefile

在这里插入图片描述
在这里插入图片描述

第二版makefile

可以考虑编译过程分解,先生成 .o 文件,然后使用 .o 文件变成结果
在这里插入图片描述
在这里插入图片描述

第三版makefile

定义变量
在这里插入图片描述
在这里插入图片描述
Makefile隐含规则:默认处理第一个目标

第四版makefile

函数

  • wildcard:可以进行文件匹配
  • patsubst:内容的替换

makefile变量

  • $@: 代表目标
  • $^ : 代表全部依赖
  • $< : 第一个依赖
  • $? : 第一个变化的依赖

在这里插入图片描述
在这里插入图片描述

第五版makefile

  • 添加清理功能(@在规则前作用)
  • “-”的作用就是,即使该条规则报错,仍然继续执行
  • 防止有歧义, 定义伪目标

在这里插入图片描述
在这里插入图片描述

Final版makefile

在这里插入图片描述
在这里插入图片描述

# get all .c file
SrcFiles=$(wildcard *.c)

# all .c files ---> .o files
ObjFiles1=$(patsubst %.c,%.o,$(SrcFiles))

all:app.out

# 目标文件用法 $@: 目标;$<: 依赖
app.out:$(ObjFiles1)
	gcc -o $@ -I./include $(ObjFiles1) 

# 模式匹配规则, $@,$<这样的变量,只能在规则中出现
%.o:%.c
	gcc -c $< -I ./include -o $@ 

test:
	@echo $(SrcFiles)
	@echo $(ObjFiles1)

# 定义伪目标,防止有歧义
.PHONY:clean all

# 添加清理功能
clean:
	-@rm -f *.o     # 加 @表示指令不输出
	-@rm -f app.out
展开阅读全文

Linux系统编程第05期:进程间通信

07-25
Linux系统提供了各种系统调用API用于进程之间的通信:     无名管道PIPE     命名管道FIFO     消息队列     共享内存     信号量     文件锁     信号signal.... 其中还包括system V和POSIX 两种接口标准,除此之外,Linux系统自身还扩展了自己的一套API接口用于进程间通信,比如signalfd、timerfd、eventfd等。 本视频教程为《Linux系统编程》第05期,本期课程将会带领大家学习Linux下将近15种进程间通信IPC工具的使用,了解它们的通信机制、编程实例、使用场景、内核中的实现以及各自的优缺点。 本课程会提供PDF版本的PPT课件和代码,学员购买课程后可到课程主页自行下载 嵌入式自学路线指导图: ------------------------------------------------------------------------------------------------------                    《嵌入式工程师自我修养》嵌入式自学系列教程                                           作者:王利涛 ------------------------------------------------------------------------------------------------------ 一线嵌入式工程师精心打造,嵌入式学习路线六步走:  第 1 步:Linux三剑客 零基础玩转Linux+Ubuntu Git零基础实战:Linux开发技能标配 vim从入门到精通基础篇:零基础学习vim基本命令 vim从入门到精通定制篇:使用插件打造嵌入式开发IDE makefile工程实践基础篇:从零开始一步一步写项目的Makefile makefile工程实践第2季:使用Autotools自动生成Makefile 软件调试基础理论 printf打印技巧 Linux内核日志与打印 使用QEMU搭建u-boot+Linux+NFS嵌入式开发环境 第 2 步:C语言嵌入式Linux高级编程 第1期:C语言进阶学习路线指南 第2期:计算机架构与ARM汇编程序设计 第3期:程序的编译、链接和运行原理 第4期:堆栈内存管理 第6期:数据存储与指针 第7期:嵌入式数据结构与Linux内核的OOP思想 第8期:C语言的模块化编程 第9期:CPU和操作系统入门       搞内核驱动开发、光会C语言是不行的!       你还需要学习的有很多,包括:计算机体系架构、ARM汇编、程序的编译链接运行原理、CPU和操作系统原理、堆栈内存管理、指针、linux内核中的面向对象思想、嵌入式系统架构、C语言的模块化编程..... 第 3 步:Linux系统编程 第00期:Linux系统编程入门 第01期:揭开文件系统的神秘面纱 第02期:文件I/O编程实战 第03期:I/O缓存与内存映射 第04期:打通进程与终端的任督二脉 第05期:进程间通信-------------------we are here!‍      第 4 步:Linux内核编程‍     练乾坤大挪移,会不会九阳神功,是一道坎。搞驱动内核开发,懂不懂内核也是一道坎。 第 5 步:嵌入式驱动开发     芯片原理、datasheet、硬件电路、调试手段、总线协议、内核机制、框架流程.... 第 6 步:项目实战     嵌入式、嵌入式人工智能、物联网、智能家居...
©️2020 CSDN 皮肤主题: 酷酷鲨 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值