Makefile从入门到项目编译实战(学习笔记)

1.make和makefile介绍

1. make

  make 是一个应用程序,位于 /usr/bin/make 目录下,make有如下的功能:

  (1)解析源程序之间的依赖关系

  (2)根据依赖关系自动维护编译工作

  (3)执行宿主操作系统中的各种命令

2. makefile

**  makefile**是一个描述文件

  (1)定义一系列的规则来指定源文件编译的先后顺序。

(2)拥有特定的语法规则,支持函数定义和函数调用。

  (3)能够直接集成操作系统中的各种命令。

3. make 和 makefile 之间的关系

  makefile 中的描述用于指导 make 程序如何完成工作。

  make 根据 makefile 中的规则执行命令,最后完成编译输出。

4.相关概念

Makefile 是啥

工个工程中的源文件不计其数,其按类型、功能、模块分别放在若干个目录中,makefie 定义了一系列的规则来指定哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作。

【百度百科 https://baike.baidu.com/item/Makefile/4619787】

Make与Makefile 的关系

make 是一个命令工具,它解释 Makefile 中的指令。在 Makefile 文件中描述了整个工程所有文件的编译顺序、编译规则。

Makefile 命名规则

Makefile 或 makefile,一般使用 Makefile

Cmake 又是啥

CMake是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装(编译过程)。他能够输出各种各样的 makefie 或者 project 文件,能测试编译器所支持的 C++特性,类似 UNIX 下的 utomake。只是 CMoke的组态档取名为 CMakelists.txt。cmake 并不直接建构出最终的软件,而是产生标准的建构档(如 Unix 的Makefile 或 Windows Visual C++的 projects/workspaces),然后再依一般的建构方式使用。百度百科 https://baike.baidu.com/item/cmake

Cmake与CMakeLists 的关系

cmake 是一个命令工具,可用来生成,makefile。但也要根据 CMakelists.txt 中的内容来生成,CMakelists.txt 就是写给cmake 的规则。
重点

make 是一个命令工具,Makefile 是一个文件,make 执行的时候,去读取Makefile 文件中的规则,重点是 makefile 得自己写。

cmake是一个命令工具,CMakelists.txt 是一个文件,cmake 执行的时候,去读取 CMakelists.txt文件中的规则,重点是(Makelists.txt 得自己写。

2.makefile的结构

1. makefile 的意义

  (1)makefile 用于定义源文件之间的依赖关系 (在阅读开源软件源码时,可通过Makefile掌握源码中各个文件之间的关系)

  (2)makefile 说明如何编译各个源文件并生成可执行程序  

2. makefile 的规则

  (1)makefile 规则的定义

      形式1: targets : prerequisitescommand

      形式2: targets : prerequisites

          '\t'   command

  (2)makefile 规则中各元素的含义

    targets 目标

      • 通常是需要生成的目标文件名  
      • make 所需执行的命令名称

    prerequisities 依赖        

      • 当前目标所依赖的其它目标或文件

     command 命令

      • 完成目标所需要执行的命令(系统自带命令 --- PATH 环境变量、用户命令 --- 自己指定路径)

  (3)规则中的注意事项

    targets 可以包含多个目标

      • 使用空格对多个目标进行分隔  

    prerequisities 可以包含多个依赖          

      • 使用空格对多个依赖进行分隔

     Tab 键:'\t'

      • 每一个命令行必须以 Tab 字符开始
      • Tab 字符告诉 make 此行是一个命令行

    续行符: \ 

      • 可以将内容分开写到下一行,提高程序的可读性

    makefile可以在命令前添加 @ 符号,使该命令静默执行

  (4)一个 makefile 的规则示例 

objectivec 复制代码
all : test
      echo "make all"
 
 test :
      echo "make test"

3. makefile依赖(prerequisites)的规则

  (1)当目标对应的文件不存在时,执行对应的命令

  (2)当依赖在时间上比项目更新时,执行对应命令

  (3)当依赖关系连续发生时,对比依赖链上的每一个目标

4. makefile编程实验

objectivec 复制代码
 //mian.c源码
 
 int main(void)
 {
     func();
     return 0;
 }
objectivec 复制代码
 //func.c源码
 
 #include <stdio.h>
 
 void func()
 {
     printf("hello make!\n");
 }
objectivec 复制代码
  #makefile源码
  
  hello.out all : main.o func.o
      gcc -o hello.out main.o func.o
  
  main.o : main.c
      gcc -o main.o -c main.c
  
  func.o : func.c
     gcc -o func.o -c func.c

  (1)工程开发中可以将 最终可执行文件名all 同时作为makefile中第一条规则的目标。但最终可执行文件名要放在all之前,make默认使用多个目标中的首个目标。这样做的好处是 当默认执行make时,make会自行判断依 赖关系有没有发生更新,如果没有就不会重新编译程序。如果这里用all作为目标,由于不存在all这个文件,每次执行make时,第一条规则的命令 总会被执行,这与实际不符。如果需要强制编译 该程序,执行make all 即可。

  (2)makefile不仅可以用在C/C++中,同样可以用在其它编程语言中,如Java等。makefile只是解决问题的一种方法,但普遍应用于C/C++中。

5. hello word实战

Makefile 基本语法

目标:依赖

Tab 命令

目标:一般是指要编译的目标,也可以是一个动作依赖:指执行当前目标所要依赖的先项,包括其它目标,某个具体文件或库等一个目标可以有多个依赖

命令:该目标下要执行的具体命令,可以没有,也可以有多条多条时,每条命令一行

没有指定目标,默认执行第一个;指定目标,指定对应命令

make clean删除编译的中间文件;

指定makefile所在目录;

3.程序编译流程详解

1.没有使用makefile的编译

2.把编译命令放置makefile

这样的makefile不好!!!

修改上面的makefile:

修改目的

**# 第一次编译两小时

第二次编译五分钟

这样分开来写,保证只编译有改动的代码**

objectivec 复制代码
#calc:
#	gcc add.cpp sub.cpp multi.cpp calc.cpp -o calc

calc:add.o sub.o multi.o
	gcc add.o sub.o multi.o calc.cpp -o calc

add.o:add.cpp
	gcc -c add.cpp -o add.o

sub.o:sub.cpp
	gcc -c sub.cpp -o sub.o

multi.o:multi.cpp
	gcc -c multi.cpp -o multi.o

3.编译流程详解

main.o文件是执行不了的,还需要进行最后一步链接!即:gcc -lstdc++ main.0 得到名为 a.out 的可执行文件

正常情况:gcc -lstdc++ main.cpp即可得到a.out,实际这条命令内部执行了4个步骤:

gcc/g++ 编译流程详解:

gcc -lstdc++ main.cpp 直接从源代码到目标可执行文件了

把过程拆分
预处理 :gcc -E main.cpp > main.ii
编译 : gcc -s main.i 得到名为 main.s 的汇编文件

汇编 :gcc-c main.s 得到名为 main.o(.obj)的二进制文件

链接 :gcc -lstdc++ main.0 得到名为 a.out 的可执行文件

4.makefile脚本运行流程介绍

5.makefile伪目标和模式匹配

6.makefile中的变量

7.makefile条件判断和循环语句

8.makefile函数定义和调用

9.makefile调用shell命令

10.makefile嵌套调用

11.makefile路径搜索

12.makefile同样部分做公共头文件

13.makefile编译静态链接库和动态链接库

14.make_install实现

15.makefile其它语法使用说明

相关推荐
袁小皮皮不皮5 小时前
1.HCIP BFD 学习笔记(优化版)
服务器·网络·笔记·网络协议·学习·智能路由器·ip
装不满的克莱因瓶5 小时前
【自动驾驶领域】学习 Cityscapes 数据集——城市街景语义理解的标准基准
人工智能·pytorch·python·深度学习·学习·机器学习·自动驾驶
清辞8536 小时前
产品经理需求推进流程
大数据·深度学习·学习·产品经理
YM52e7 小时前
鸿蒙PC ArkTS 声明合并问题深度解析与最佳实践
学习·华为·harmonyos·鸿蒙·鸿蒙系统
海兰7 小时前
【实用程序】电商销售分析仪表盘 — 从零搭建一个AI参与的全栈数据洞察系统
人工智能·学习·算法
ken22328 小时前
在 Libreoffice Calc中输入自定义表情字符时,需要保存之后,才能正常显示
学习
zwenqiyu8 小时前
P5283 [十二省联考 2019] 异或粽子题解
c++·学习·算法
编程圈子8 小时前
电机驱动开发学习2. 直流无刷电机工作原理
驱动开发·学习
MartinYeung59 小时前
[论文学习]大型语言模型(LLM)安全与隐私-基于善、恶、丑的深度分析
学习·安全·语言模型
什仙9 小时前
Mathcad Prime 的教程资料
学习·工具