Makefile语法总结

C语言编译过程

预处理:将.h和.c文件处理为.i文件
编译:将.i文件编译为.s文件(汇编文件)
汇编:将.s文件编译为.o文件(二进制文件)
链接:将.o文件链接为.out文件(可执行文件)

GCC编译器参数

gcc -E hello.c >a.txt 只激活预处理,把程序重定向到a.txt文件。
gcc -S hello.c 只激活预处理和编译,把程序编译成汇编文件。
gcc -c hello.c 只激活预处理,编译和汇编,把程序编译成obj文件。
gcc -o hello.exe hello.c 指定输出文件名称,默认为a.out。
gcc -O0 -O1 -O2 -O3 编译器4个优化等级,-O0表示不优化;-O1表示默认值,-O3优化等级最高。

GNU 的 make 工作时的执行步骤

1、读入所有的 Makefile。
2、读入被 include 的其它 Makefile。
3、初始化文件中的变量。
4、推导隐晦规则,并分析所有规则。
5、为所有的目标文件创建依赖关系链。
6、根据依赖关系,决定哪些目标要重新生成。
7、执行生成命令。

make参数

-C <dir> 读取指定makefile目录,当使用-C参数时,-w会自动被打开。
-I <dir> 指定一个包含makefile的目录
--include-dir=<dir> 指定一个包含makefile的目录
-j <jobsnum> 指同时运行命令的个数
-r 禁止make使用任何隐含规则
-R 禁止make使用任何作用于变量上的隐含规则
-w/--print-directory 进入和退出目录时,会输出Entering directory和Leaving directory。
-s/--slient/--quiet 进入和退出目录时,不会输出Entering directory和Leaving directory,-w总是失效的。
--no-print-directory 进入和退出目录时,不会输出Entering directory和Leaving directory,-w总是失效的。

Makefile文件包含

include 如果找不到包含文件,make就停止。
sinclude 如果找不到包含文件,忽略该错误,继续执行。

Makefile文件注释

#这是一行注释

Makefile格式

目标文件 : 依赖文件(Tab)命令
核心:依赖文件中有一个文件比目标文件新,或者目标文件不存在,就要执行命令。

通配符

*
?
[]
"%" 的意思是表示一个或多个任意字符。

make变量

SHELL
MAKEFLAGS (该变量定义了make参数)
注意:除非使用unexport声明,否则这两个变量都将传递给下级Makefile。

传递变量

export 变量名 (传递变量到下级Makefile)
export (传递所有变量到下级Makefile)
unexport 变量名 (不传递变量到下级Makefile)

环境变量

KBUILD_EXTMOD //编译外部模块,设置源码路径

内置变量

CURDIR := /home/zht  # 记录当前路径
SHELL = /bin/sh
MAKEFILE_LIST :=  Makefile
.DEFAULT_GOAL := all
MAKEFLAGS = p
HOSTARCH := x86_64
CC = cc        # C语言编译器的名称
CPP = $(CC) -E  # C语言预处理器的名称 $(CC) -E
CXX = g++       # C++语言的编译器名称
RM = rm -f     # 删除文件程序的名称
CFLAGS          # C语言编译器的编译选项,无默认值
CPPFLAGS        # C语言预处理器的编译选项,无默认值
CXXFLAGS        # C++语言编译器的编译选项,无默认值
......

自动化变量

$@:目标文件集合
规则中的目标集合,在模式规则中,如果有多个目标的话,“$@”表示匹配模式中定义的目标集合。
$%
当目标是函数库的时候表示规则中的目标成员名,如果目标不是函数库文件,那么其值为空。
$<:第一个依赖文件
依赖文件集合中的第一个文件,如果依赖文件是以模式(即“%”)定义的,那么“$<”就是符合模式的一系列的文件集合。
$?
所有比目标新的依赖目标集合,以空格分开。
$^:依赖文件集合
所有依赖文件的集合,使用空格分开,如果在依赖文件中有多个重复的文件,“$^”会去除重复的依赖文件,值保留一份。$+ 和“$^”类似,但是当依赖文件存在重复的话不会去除重复的依赖文件。
$*
这个变量表示目标模式中"%"及其之前的部分,如果目标是 test/a.test.c,目标模式为 a.%.c,那么“$*”就是 test/a.test。

变量赋值

定义变量 objects = main.o kbd.o command.o display.o
$() 引用变量 $(objects)
= 变量的值是整个makefile文件中最后被指定的值,最后展开变量。
:= 定义的变量不能使用后面定义的变量,只能使用前面定义好的变量。
?= 变量是否被定义过,未定义则赋值,定义过则什么也不做。
+= 追加变量值

文件搜索

VPATH变量
VPATH变量=src:../headers
设置VPATH变量目录为src和../headers,其中目录名用:隔开。
make默认会在当前目录寻找依赖和目标文件,如果找不到,才会到指定的目录中去寻找文件。vpath关键字

显示命令 @

echo:在shell中显示echo这条命令和这条命令的输出结果。
@echo:不会在shell中显示echo这条命令,但是会显示命令的输出结果。

执行命令 连续执行

如果你要让上一条命令的结果应用在下一条命令时,应该使用分号分隔这两条命令。
exec:
cd /home/hchen; pwd

命令出错 在命令行前加-

clean:rm -f *.o     //如果出错,不再执行。-rm -f *.o     //不管是否出错,都执行。

伪目标 .PHONY

all clean install print tar dist TAGS check test

清理工程

make clean //清除编译的可执行文件和配置文件。
make distclean //清除所有生成的文件。

条件编译

ifeq(a,b) else endif //判断a和b是否相等
ifneq(a,b) else endif   //判断a和b是否不等
ifdef(a) else endif     //判断a是否被定义
ifndef(a) else endif    //判断a是否未被定义

shell函数

格式:name := $(shell 命令)
shell函数把执行操作系统命令后的输出作为函数返回。我们可以用操作系统命令以及字符串处理命令awk,sed等命令来生成一个变量。
contents := $(shell cat foo)
files := $(shell echo *.c)

函数调用

函数调用格式:$(<function> <arguments>)字符串处理函数 $(subst <from>,<to>,<text>)$(patsubst <pattern>,<replacement>,<text>)$(strip <string>)$(findstring <find>,<in>)$(filter <pattern...>,<text>)$(filter-out <pattern...>,<text>)$(sort <list>)$(word <n>,<text>)$(wordlist <s>,<e>,<text>)$(words <text>)$(firstword <text>)文件名操作函数$(dir <names...>)$(notdir <names...>)$(suffix <names...>)$(basename <names...>)$(addsuffix <suffix>,<names...>)$(addprefix <prefix>,<names...>)$(join <list1>,<list2>)$(foreach <var>,<list>,<text>)$(if <condition>,<then-part>)$(call <expression>,<parm1>,<parm2>,<parm3>...)$(origin <variable>) //查看变量的来源函数返回值:undefined        //variable变量未定义,返回undefined。default      //variable是一个环境变量,并且当Makefile被执行时,-e参数没有被打开。file          //variable变量被定义在Makefile中,返回file。command line    //variable变量被命令行定义。override         //被override指示符重新定义。automatic        //是一个命令运行中的自动化变量。

C程序的隐含规则

“<n>.o”的目标的依赖目标会自动推导为“<n>.c”,并且其生成命令是“$(CC) –c $(CPPFLAGS) $(CFLAGS)”

Makefile代码分析

make (不带参数) 当make后不带参数时,默认执行第一个伪目标的操作。
make clean 清楚操作
make copy 复制操作
make install 安装操作
KERNELDIR := /home/chen/Linux/linux_kernel/linux_kernel
/* 将路径赋值给KERNELDIR变量 */
CURRENT_PATH := $(shell pwd)
/* 将路径赋值给CURRENT_PATH变量 */
obj-m := helloworld.oobj-y +=xxx.o 该模块编译进内核文件。obj-m +=xxx.o 该模块不会编译成可加载模块。
/* build kernel_modules clean copy 都是makefile中的伪目标 */
build: kernel_modules
/* build依赖于kernel_modules,其实还是执行的$(MAKE) -C $(KERNELDIR) M=$(CURRENT_PATH) modules这一条命令。 */
kernel_modules:$(MAKE) -C $(KERNELDIR) M=$(CURRENT_PATH) modules
/*  $(MAKE)就相当于make-C 选项的作用是指将当前工作目录转移到你所指定的位置。“M=”选项的作用是,当用户需要以某个内核为基础编译一个外部模块的话,需要在make modules 命令中加入“M=dir”,程序会自动到你所指定的dir目录中查找模块源码,将其编译,生成KO文件。modules作为参数还可以有以下选择:modules_install clean help */
install:$(MAKE) -C $(KERNELDIR) M=$(CURRENT_PATH) modules_install
clean:$(MAKE) -C $(KERNELDIR) M=$(CURRENT_PATH) clean
copy:sudo cp *.ko /home/chen/Linux/nfs/buildroot-rootfs/lib/modules/4.1.15 -f

Makefile语法总结相关推荐

  1. C语言:gcc编译过程及make命令、makefile语法规则

    gcc编译过程 编译过程: make && makefile make概述 makefile语法规则 make命令格式 Makefile案例 之所以写成多个文件,是出于模拟多模块编程的 ...

  2. Makefile语法基础

    Makefile语法 1. 规则格式 Makefile的规则格式如下示 目标... : 依赖文件集合...命令1命令2...... 命令列表中的每条命令必须以TAB键开始 Makefile中使用&qu ...

  3. window gcc编译器备忘录[Makefile语法说明][make clean指令错误(process_begin: CreateProcess()failed.]

    Makefile语法说明 请看如下网址,有很详细的说明:http://c.biancheng.net/makefile/ 比如Makefile自动化变量: make clean指令错误 本文摘录于:h ...

  4. Makefile语法基础介绍

    在Linux下,make是一个命令工具,是一个解释Makefile中指令的命令工具.make命令执行时,需要一个Makefile文件,以告诉make命令需要怎么样去编译和链接程序. make如何工作: ...

  5. makefile语法_Makefile的语法

    ARM裸机1期加强版视频课程配套WiKi第9课第6节_Makefile的语法. 通配符 假如一个目标文件所依赖的依赖文件很多,我们岂不是要写很多规则?这显然不合乎常理. 我们可以使用通配符解决这些问题 ...

  6. Makefile 语法入门

    一.Makefile 简介 Makefile 是一种常用于编译的脚本语言.它可以更好更方便的管理你的项目的代码编译,节约编译时间(没改动的文件不编译). 注意 Makefile 文件命令必须是 Mak ...

  7. makefile 语法 /usr/bin/ld: cannot find -lxxxx

    GCC编译错误 1./usr/bin/ld:/tmp/ccd/UkmoA.o :undefined reference to symbol 'ERR_free_strings@OPENSSL_1.0. ...

  8. 实用的GCC Makefile语法及参数详解

    二话不说,先上一个Makefile的源码. 基于下述的Makefile,可以直接执行命令: 编译: make   or   make -f Makefile all 清除: make clean  o ...

  9. Linux后台开发系列之「09.Makefile 基础语法」

    Makefile 版权声明:本文为 cdeveloper 原创文章,可以随意转载,但必须在明确位置注明出处! Makefile 简介 Makefile 是一个管理项目的配置文件,它主要有 2 个作用: ...

最新文章

  1. 第一章 Shiro简介——跟我学习springmvc shiro mybatis
  2. 使用MCI方法操作声音文件
  3. bzoj 3343: 教主的魔法
  4. mybatis_SQL映射(1)
  5. java怎么清空一个文件内容_如何从文本文件中删除特定内容? - java
  6. VirtualBox设置共享目录(主机win7,虚拟机Ubuntu)
  7. 【监听文件 多线程】使用java--WatchService监听文件 开启多线程copy文件
  8. 隐马尔科夫模型(HMM)
  9. 怎么将图片转成html,一种将图片转成HTML文档的方法与流程
  10. 中国现代书画家——袁晓丹、潘文兵、郑锋等
  11. 旧电脑很卡怎么重新安装电脑系统?
  12. 编写一个程序,完成字符大小写的转换。
  13. 联筑赚赋能传统模架产业链数字化 促进产业发展互利共赢
  14. xmlserializer_更改XmlSerializer输出临时程序集的位置
  15. python 读excel中的sheet_python读取excel文件中所有sheet表格
  16. BZOJ4585 [Apio2016]烟火表演
  17. sql 处理数据字段为空 如果为空转换成别的值
  18. 7月16日周二晚上,陈勇,【敏捷网络课堂第六期】【免费】敏捷开发早期估算
  19. 荆门市掇刀石中学2021高考成绩查询,2021荆门十大重点高中排名 荆门中学排行榜...
  20. VR全景制作的行业应用,让生活更加便捷

热门文章

  1. Spring Cloud Sleuth + Zipkin + RabbitMQ 监控微服务应用(二)
  2. linux 如何查看远程代码分支,linux看git 创建分支、删除本地分支、查看远程分支、本地分支例子...
  3. idea jdbc封装_IDEA 中 MyBatis还可以这么玩!!!
  4. pandas 读取/保存压缩格式的csv文件.csv.gz
  5. Linux查询用户创建的后台程序
  6. python函数使用两个小括号
  7. 怎么将ip地址改成域名访问_什么是域名解析?怎么把域名解析成IP地址?
  8. sap委外采购订单冲销 102_SAP那些事-实战篇-68-谈谈SAP的库存设计理念
  9. mysql的账户之间_MySQL用户管理
  10. JS中同名函数有效执行顺序