乐趣区

关于语言:makefile带你了解一种常用语GNU-gcc编译的工具语言

摘要: 该文章次要介绍 makefile,一种常用语 GNU gcc 编译的工具语言,同时 LiteOS 也是利用该文件对工程项目进行 make 构建生成执行文件的。

LiteOS 源码中应用 makefile 进行文件的批处理编译和连贯到生成文件,如果在应用 LiteOS 来设计工程时应用 GNU 编译器进行编译,个别会都会应用到 makefile 进行编译和链接程序,如果应用的 Keil 或 IAR 的编译器进行编译则在 Keil IDE 或 IAR IDE 中设置编译器信息和文件包换门路就能够了进行编译链接和输入文件。

1、makefile 介绍

简略的说 makefile 就是 make 执行的文件,将代码变成可行性文件的的过程叫做编译,组成一系列文件的编译叫做构建(build),Make 是 GNU 提供的构建工具,次要用 C、C++ 我的项目的构建编译过程,要学会应用 Make,咱们就须要学会应用 makefile 编写,makefile,该文件形容了如何编译和链接由几个 C 源文件和几个头文件组成的文本编辑器。当明确要求时,makefile 还能够通知 make 如何运行其余命令(例如,删除某些文件作为清理操作)

1.1 makefile 规定

一个简略的 makefile 由具备以下形态的“规定”组成:

target … : prerequisites …
        recipe
        …
        …

target(指标) 通常是由程序生成的文件的名称。指标的示例是可执行文件或指标文件。指标也能够是要执行的操作的名称,例如“clean”;

prerequisites(前置条件) 是一个文件,该文件用作创立指标的输出。一个指标通常取决于几个文件;

recipe(命令) 是一种要执行的动作。配方可能在同一行上或在本人的行上具备多个命令。请留神:您须要在每个配方行的结尾增加一个制表符!这是一个含糊的中央,引起了人们的留神。如果您心愿在食谱中应用制表符以外的其余字符作为前缀,则能够将.RECIPEPREFIX 变量设置为其余字符

“ 指标 ” 是必须的,不可省略;” 前置条件 ” 和 ” 命令 ” 都是可选的,然而两者之中必须至多存在一个。

一条规定阐明了如何以及何时从新制作作为特定规定指标的某些文件。make 依据创立或更新指标的先决条件执行办法。规定还能够解释如何以及何时执行某项操作。一个 makefile 可能蕴含除规定之外的其余文本,然而一个简略的 makefile 只需蕴含规定。规定看起来可能比此样例中显示的要简单一些,但所有规定或多或少都适宜该模式。

1.2Makefile 语法

① # 示意正文

② 通配符用来指定一组符合条件的文件名。Makefile 的通配符与 Bash 统一,次要有星号()、问号(?)和 […]。比方,.o 示意所有后缀名为 o 的文件。

③ % 模式匹配

如须要编译当前目录下 a.c 和 b.c 两个文件,原来的写法是:

a.o: a.c
b.c: b.c

利用 % 能够简写为:

%.o : %.c

在解决大量同类型文件时既能够利用 % 简写文件

④“=”自定义变量

txt = Hello World
test:
    @echo $(txt)

下面的 txt 代替的了“Hello World”

同时基于“=”Makefile 提供了(=、:=、?=、+=)四个赋值运算操作。

⑤ 内置变量

Make 有本人的操作变量,特指一些本人的性能命令;如:$(CC) 指向以后应用的编译器,$(MAKE) 指向以后应用的 Make 工具

具体变量规定可参考:https://www.gnu.org/software/…

⑥ 主动变量(Automatic Variables)

makefile 提供一些与规定相干的变量,罕用的有:

(1)$@ —– 指代以后指标

(2)$< —– 指代第一个前置条件

a.txt: b.txt c.txt
    cp $< $@ 

下面的代码和上面的代码统一

a.txt: b.txt c.txt
    cp b.txt a.txt 

$< 指代第一个前置条件,即“b.txt”;$@ 指代目标值即“a.txt”

(3)$? —— 指代比指标更新的所有前置条件,之间以空格分隔。比方,规定为 t: p1 p2,其中 p2 的工夫戳比 t 新,$? 就指代 p2。

(4)$^ —— 指代所有前置条件,之间以空格分隔。比方,规定为 t: p1 p2,那么 $^ 就指代 p1 p2。

(5)$* —— 指代匹配符 % 匹配的局部,比方 % 匹配 f1.txt 中的 f1,$* 就示意 f1。

(6)$(@D) 和 $(@F)—— 别离指向 $@ 的目录名和文件名。比方,$@是 src/input.c,那么 $(@D) 的值为 src,$(@F) 的值为 input.c。

(7)$(<D) 和 $(<F) —— 别离指向 $< 的目录名和文件名。

1.3 makefile 循环

Makefile 应用 Bash 语法,实现判断和循环。

如 ifeq — else — endif 应用

ifeq ($(CC),gcc)
  libs=$(libs_for_gcc)
else
  libs=$(normal_libs)
endif

以上代码通过判断编译器是否为 gcc 决定编译不同的门路。

1.4 makefile 函数

Makefile 提供一些内置函数,应用格局如下:

$(function arguments)
# 或者
${function arguments}

内建函数如下表:具体函数参考门路 (https://www.gnu.org/software/…

2.mikefile 文件编写

如下文件编译一个 C 语言工程,蕴含 main.c kdb.c display.c 三个源文件及 defs.h、command.h、两个头文件

编译代如下:

edit : main.o kbd.o command.o display.o 
    cc -o edit main.o kbd.o command.o display.o

main.o : main.c defs.h
    cc -c main.c
kbd.o : kbd.c defs.h command.h
    cc -c kbd.c
command.o : command.c defs.h command.h
    cc -c command.c
display.o : display.c defs.h
    cc -c display.c

clean :
     rm edit main.o kbd.o command.o display.o

.PHONY: edit clean

该代码中,清空了输入文件,而后利用 gcc 编译器编译了三个头文件和两个文件。

本文分享自华为云社区《一文读懂 LiteOS 中的“makefile”文件(1)—-makfile 简介》,原文作者:o0 龙龙 0o。

点击关注,第一工夫理解华为云陈腐技术~

退出移动版