1:make和Makefile的介绍: 概念 在软件的工程中的源文件是不计其数的,其按照类型,功能,模块分别放在若干个目录中,哪些文件需要编译,那些文件需要后编译,那些文件需要重新编
在软件的工程中的源文件是不计其数的,其按照类型,功能,模块分别放在若干个目录中,哪些文件需要编译,那些文件需要后编译,那些文件需要重新编译,甚至进行 更复杂的功能操作,这就引入了我们的系统编译的工具:
在linux和unix中,有一个强大的使用程序,叫make,可以用它来管理多模块程序的编译和链接,直至生成可执行文件
make使用程序读取一个说明文件,称为Makefile,Makefile文件中描述了整个软件工程的 编译规则和各个文件之间的依赖关系;
Makefile就像是一个shell脚本一样,其中可以执行操作系统的命令,它带来的好处就是我们能够实现“自动化编译”,一旦写好,只要一个make命令,整个软件功能就完全自动编译,极大的提高了软件开发的效率;
make是一个命令工具,是一个解释Makefile中指令的命令工具,一般来说大多数IDE都有这个命令
使用make可以是重新编译的次数达到最小化;
make使用语法:
make [选项][目标][宏定义]
选项列表:
-d 显示调试信息(debug)
-f<文件> 指定从那个文件中读取以来关系,默认文件是"Makefile"或者"makefile","-"表示从标准输入(file)
-h 显示所有选项的简要说明(help)
-n 不运行任何Makefile命令,只去现实它们(no)
-s 安静的方式运行,不显示任何信息(silence)
可以使用-h来获取更多的选项:
当make命令不带选项运行的时候,它从Makefile中读取指定规则
当制定规则不同与Makefile(makefile)的其他文件中时候,就要运行带有-f选项的make命令。如make.fray.Makefile
make -f make.fray.Makefile
目标列表:关联性列表
<TAB>命令列表
目标列表:是用一个或者多个空格分开的目标文件的清单
关联性列表:同样是一个或者多个空格分开的目标文件,是目标列表所以来的多个目标文件的清单;
命令列表:用于创建目标文件的将要执行的命令清单,这个命令列表被换行符号分开,命令列表中的每个命令必须要以<TAB>字符开始;
如:##Sample
power:power.c
GCc -o power power.c
如:#Sample
power:power.o demo.o
gcc -o power power.o demo.o
power.o:power.c
gcc -o power.o -c power.c
demo.o:demo.c
gcc -o demo.o -c demo.c
注意:书写的形式类似于倒推的形式
目标列表:关联性列表;命令列表
命令列表是一系列被分号隔开的命令,一个很长的命令行要续行的时候需要用一个反斜杠符号
如:all/mymath_test:src/mymath.c src/mymath_test.c; \
gcc -o all/mymath_test src/mymath.c \
src/mymath_test.c
注意:makefile书写主要注意的是:
简单变量:
定义
变量名字:=[文本]
这类变量的实质就是一组字符串
添加
变量名字+=[文本]或者 变量名字:=[文本][文本]
引用变量
$(变量名)
$单字符变量(指的是但字符的变量 a:=123 $a)
如:G:=gcc 一般我们都是定义成大写的
$G -o power power.c
内置变量:
$@ 当前目标的名词
$? 比当前目标更新的已修改的依赖性列表
$< 依赖性列表的第一个文件
$^ 用空格分开的所有依赖性列表
虚目标是不存在的文件
虚目标允许你去强制执行某些事件,但这些事件在正常的规则中是不会发生的
虚目标不是真正的文件,make命令可以使用针对他们的任意规则
虚目标总是使与之有关的命令被执行
all 生成工程中所有可以执行者,通常是makefile的第一个生成目标
test 运行程序的自动测试套件
clean 删除make all生成的所有文件
install 在系统目录中安装工程项目生成的可执行文件和文档
uninstall 删除make install安装的所有文件
make中有一些与定义的目标,这些预定义目标被make以一种特殊的方式进行处理,这些目标称为特殊目标;
.DEFAULTS 如果make找不到生成目标的任何makefile入口或后缀规则,就执行与目标相关的命令
.IGNORE 如果某一行makefile包含该目标,make忽略错误代码并继续建立,如果一个命令不正常存在,make自然会停止,带有-i选项的make命令可以执行相同的任务
.PHONY
允许你指定一个不是文件的目标,所以您能只是make调用一系列makefile中的命令,即使在当前目录中有一个具有相同名字的文件
.SILENT
make执行这些命令,但是不显示这些命令,带有-s的make可以执行相同的人物,
.SUFFIXES
为目标指定的前提(后缀)可以与后缀规则相互关联,如果与目标没有相关性的前提,以存在的后缀列表就会被删除
make中有许多预定义的规则成为后缀规则,它可以让make自动执行许多任务
为了建立一个目标,make会遍历一连串的依赖关系,这是为了决定从何处开始建立,如果没有找到目标文件,make就按有限顺序查找源文件
默认模式规则:
%o:%c
$(CC) $(CFLAGS) -c $<
$o:%s
$(CC) $(AFLAGS) -o $@ $<
#:注释
\:连接符号
关联列表和命令列表中可以使用shell通配符号? * %等
#Sample
CC:=gcc
CFLAGS:=-Iinclude
CFLAGS+=-c
TARGET:=all/mytest_test3
DEPEND:=obj/mymath.o
DEPEND+=obj/mymath_test.o
$(TARGET):$(DEPEND)
$(CC) -o $@ $^
#obj/mymath.o:src/mymath.c
# $(CC) -o $@ $(CFLAGS) $^
#obj/mymath_test.o:src/mymath_test.c
# $(CC) -o $@ $(CFLAGS) $^
#使用make中的默认的模式规则
obj/%.o:src/%.c
$(CC) -o $@ $(CFLAGS) $^
#声明clean是一个虚目标
.PHONY:clean
clean:
rm -rf obj/mymath.o obj/mymath_test.o
到此这篇关于C语言make和Makefile介绍及使用的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持编程网。
--结束END--
本文标题: C语言make和Makefile介绍及使用
本文链接: https://www.lsjlt.com/news/161833.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
下载Word文档到电脑,方便收藏和打印~
2024-03-01
2024-03-01
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0