嵌入式(十四)——Makefile编写及多级目录

简介: 嵌入式(十四)——Makefile编写及多级目录

工程管理器make


如何编写Makefile文件

缺点:makefile编译速度很慢,只能实现自动编译,makefile适用于小型项目


1.1 什么是工程


多个源文件 + 其他文件(图片+头文件+脚本文件)


1.2 工程管理器的作用


编译多个文件 (可以实现自动编译)

------gcc + 所有源文件 -o 可执行文件


1.3 makefile文件


1.make的依赖makefile文件

2.makefile文件是一种脚本文件(批处理),存在相关语法

3.makefile语法:

三要素:目标、依赖、命令

格式:

目标:依赖

tab 命令


目标:最终生成的文件

依赖:生成目标时所需要的文件

命令:生成目标时,需要执行的命令

hello:hello.o
  gcc hello.o -o hello
hello.o:hello.c
  gcc -c hello


真目标和伪目标


真目标:如hello和hello.o

伪目标:如clean


hello:hello.o
  gcc hello.o -o hello
hello.o:hello.c
  gcc -c hello
.PHONY:clean
clean:
  rm -f hello hello.o


对于.PHONY可以查看网站:

Makefile中.PHONY的作用


1.4 执行顺序:


make:默认从第一个目标体执行

make + 目标体:从对应的目标体执行

如果目标体后面依赖的文件是一个目标的话,先执行依赖对应的目标,再执行目标体的命令

再来体会一下


hello:hello.o
  gcc hello.o -o hello
hello.o:hello.c
  gcc -c hello
.PHONY:clean install
clean:install
  rm -f hello hello.o
install:
  cp hello bin


1.5 多级目录的Makefile编写


如果有其他Makefile文件,可以格式:make -f 目标文件(如:Makefile1、Makefile2)


#Makefile1
main:main.c add.c sub.c
  gcc $^ -o $@


#Makefile2
main:main.o add.o sub.o
  gcc $^ -o $@
main.o:main.c
  gcc -c main.c
add.o:add.c
  gcc -c add.c
sub.o:sub.c
  gcc -c sub.c
.PHONY:clean
clean:
  rm -f main.o add.o sub.o main


Makefile2更优(非常有必要!!!)

优势:如果单个.c文件被修改了,Makefile2只会重新编译那个修改过后的文件

如果是Makefile1,则都会重新编译,很耗时


隔断


对源码文件进行分类(学会划分目录)

make menuconfig(动态选择,不用命令)


多级目录下的makefile


顶层Makefile:总控Makefile

子目录Makefile:功能Makefile

script目录Makefile:头文件Makefile

查看顺序:script目录 --> 顶层 -->子目录


总控Makefile:进入各个功能子目录下执行make命令,将各个子目录下的.o文件链接生成可执行文件

功能Makefile:将当前目录下的.c文件编译生成.o文件

头文件Makefile:定义一些变量



make不会去编译已经是最新的文件

makefile命令尽量成首字母大写,即Makefile

makefile中用#注释

在命令前加@,在运行时,可以隐藏所执行命令

hello:hello.o
  @gcc hello.o -o hello
hello.o:hello.c
  @gcc -c hello


echo 命令相当于printf(打印)

hello:hello.o
  @gcc hello.o -o hello
  @echo make done!
hello.o:hello.c
  @gcc -c hello
  @echo make done!


默认变量

image.png

多用前三个

hello:hello.o
    @gcc $^ -o $@
相关文章
|
7月前
|
C++
MFC编程 -- 记事本项目(大体框架)
MFC编程 -- 记事本项目(大体框架)
60 0
|
6月前
|
Linux 芯片
Linux 驱动开发基础知识——查询方式的按键驱动程序_编写框架(十三)
Linux 驱动开发基础知识——查询方式的按键驱动程序_编写框架(十三)
73 2
|
7月前
|
敏捷开发 设计模式 Unix
嵌入式C语言代码的基本编写规范要求
嵌入式C语言代码的基本编写规范要求
164 0
|
7月前
|
C语言 C++
win32编程 -- 编写静态库空项目
win32编程 -- 编写静态库空项目
37 0
|
C语言
嵌入式 STM32 使用C语言打开读取歌曲目录
嵌入式 STM32 使用C语言打开读取歌曲目录
|
Linux Android开发 C++
嵌入式Linux应用程序调试法----写文件调试程序法
嵌入式Linux应用程序调试法----写文件调试程序法
72 0
|
Linux Shell C++
【Linux初阶】进程程序替换 | 初识、原理、函数、应用 & makefile工具的多文件编译
替换初识,替换原理,替换函数理解和使用,makefile工具的多文件编译,进程替换应用(简易命令行实现)
180 0
【Linux初阶】进程程序替换 | 初识、原理、函数、应用 & makefile工具的多文件编译
|
Ubuntu 编译器 Linux
Linux驱动开发笔记(三):基于ubuntu的helloworld驱动源码编写、makefile编写以及驱动编译加载流程测试
前面学习了驱动的基础框架,上一篇编译了gcc7.3.0,那么为了方便很好的熟悉流程,本篇,将使用ubuntu18.04,直接编译ubuntu18.04的驱动,然后做好本篇文章的相关实战测试。
|
Linux 编译器 C语言
Linux驱动开发笔记(一):helloworld驱动源码编写、makefile编写以及驱动编译基本流程
基于linux的驱动开发学习笔记,本篇是描述了一个字符驱动的基础开发流程,以便做嵌入式开发多年的应用或者系统学习驱动开发。
|
NoSQL 编译器 vr&ar
嵌入式(十二)——库文件及静态库与动态库的制作与使用(附练习)
嵌入式(十二)——库文件及静态库与动态库的制作与使用(附练习)
231 0
嵌入式(十二)——库文件及静态库与动态库的制作与使用(附练习)