asp有哪些网站,仿笑话网站源码,公司vi设计内容,如何搭建电影网站一、Makefile的概述
1.认识make
make 是一个命令#xff0c;是个可执行程序#xff0c;用来解析 Makefile 文件的命令#xff1b;linux 环境下#xff0c;这个命令存放在 /usr/bin/ 目录下#xff1b;当用户输入 make 指令时#xff0c;系统会自动寻找 makefile、Makef…一、Makefile的概述
1.认识make
make 是一个命令是个可执行程序用来解析 Makefile 文件的命令linux 环境下这个命令存放在 /usr/bin/ 目录下当用户输入 make 指令时系统会自动寻找 makefile、Makefile、GNUmakefile 中任何一个根据该文件中的指令编译工程。
2.什么是makefile
makefile 是一个编译指令的脚本里面记录了一条条编译指令用于描述程序的编译规则Makefile 文件里面的编译指令是根据我们自己写的程序编写的编译规则。
3.makeflie与gcc的对比 用 gcc 编译的时候我们要在后面跟上要编译的文件名如 gcc main.c func.c文件量和代码量较少的时候用这种方式编译还比较方便但如果整体项目很多文件很多的时候编译起来就比较困难而且还容易漏掉一些文件。没人能保证自己的代码一次运行成功会反复编译调试那每次调试都需要输入很长的 gcc 命令。遇到后期追加功能的时候时间长了也忘记项目用到了哪些文件了对后期工作也会造成困扰 而在 makeflie 里面提前写好了编译指令只是在编写 makefile 文件的时候需要花费时间但后面重复编译每次只需要 make 指令调用编译就行了简化了编译过程。同时后期即使追加功能以前的编译的文件指令都保存在 makefile 文件里了也不用担心忘记需要编译哪些文件 gcc 编译很大项目的时候编译时间会很长如果对代码进行了修改再编译即使没有修改代码的文件也要一起重新编译一次又得消耗很长的时间 makefile 只会对修改过的代码文件重新编译其它未修改的直接使用以前编译好的可执行文件除了第一次编译需要花费较长时间外后面编译都比较快。因此make 不仅简化了编译步骤还节省编译时间提高编译效率。
二、makefile的语法规则
1.makefile语法规则
1.1语法
先创建一个 makefile 文件在文件里面写命令
目标:依赖文件列表命令列表 // 命令列表前有缩进gcc 编译
gcc main.c -o main目标通常是要产生的可执行文件名如上面的 main依赖文件是用来输入从而产生目标的文件一个目标通常有一个或多个依赖文件如上面的 main.c命令make 执行的动作一个规则可以含几个命令有多个命令时每个命令占一行如上面的gcc main.c -o main。
注意 makefile 文件里面写的是脚本要严格遵守脚本的语法规则有时候多一个少一个空格都可能造成错误。
1.2makefile编译演示
先创建 makefile 文件在文件里写入如下命令
main:main.c func.cgcc main.c func.c -o main接着在 linux 终端输入make命令即可实现编译。
注意上面只是演示 makefile 命令的语法和真正的 makefile 实现的功能差远了。这里的 make 只会执行第一个目标的语句如果下方还有其它语句不会执行。
1.3make命令格式
1.3.1自定义 makefile 文件名
make -f 自定义文件名在终端输入 make 命令时默认在工作目录中寻找名为 GNUmakefile、makefile、Makefile 的文件作为 makefile 输入文件但如果我们不按照上面的文件名命名而是修改为自定义的文件名那么就需要在 make 命令后面加上我们自定义的文件名如
make -f my_makefile但一般不建议这样做。
1.3.2make后跟其它目标
前面说到make 执行第一个目标的语句后后面目标的语句就不会执行了那要执行后面目标的语句我们可以指定目标
make 目标例如makefile
main:main.c func.cgcc main.c func.c -o main
clean:rm main.c可以通过输入终端输入make clean来执行指定的语句。
1.3.3复杂版makefile
main:main.o fun.ogcc main.o fun.o -o main
main.o:main.cgcc -c main.c -o main.o
fun.o:fun.cgcc -c fun.c -o fun.o
clean:rm main *.o说明 当终端输入 make 命令时会执行 makefile 文件里的第一条命令但发现依赖的main.o fun.o文件不存在会执行下面的命令先生成main.o fun.o再执行第一条的命令*.o里面的 * 是通配符这里表示所有以 .o结尾的文件clean:为假想目标只有目标没有依赖。
三、makefile的变量
makefile 变量类似于 C 语言中的宏当 makefile 被 make 工具解析时其中的变量会被展开。变量一般用于保存文件名列表、保存文件目录列表、保存编译器名、保存编译参数、保存编译的输出等。
1.自定义变量
定义格式
变量名变量值说明 注意等号两边没有空格应该严格遵循脚本语言的语法编写makefile 变量名可以以数字开头区分大小写变量一般都在 makefile 的头部定义几乎可在 makefile 的任何地方使用如果需要读取变量的值需要在变量名前加上美元符号 (变量名)或${变量名}自定义变量的作用主要是为了方便切换不同编译方式方便指定生成的可执行文件名等如果一个字符在命令中出现多次就可以通过变量来代替如 CCgcc
EXECmain$(EXEC):main.o fun.o$(CC) main.o fun.o -o $(EXEC)
main.o:main.c$(CC) -c main.c -o main.o
fun.o:fun.c$(CC) -c fun.c -o fun.o
clean:rm $(EXEC) *.o2.系统环境变量
make 工具会拷贝系统的环境变量并将其设置为 makefile 的变量在 makefile 中可直接读取或修改拷贝后的变量读取环境变量的方法和前面读取自定义变量的方法相同如
CCgcc
EXECmain$(EXEC):main.o fun.o$(CC) main.o fun.o -o $(EXEC)
main.o:main.c$(CC) -c main.c -o main.o
fun.o:fun.c$(CC) -c fun.c -o fun.o
clean:rm $(EXEC) *.oecho $(PWD) // PWD 是一个环境变量 说明 echo 相当于C语言里的 printf将内容输出到终端我们除了可以使用系统的环境变量还可以自己导出环境变量export NUM100自己导出的环境变量只在当前终端有效不会影响系统的环境变量。
3.预定义环境变量
预定义环境变量即 makefile 定义好的环境变量。
$ 当前命令的目标名$ 当前命令依赖文件列表中的第一个文件$^ 当前命令依赖文件列表带有除去重复文件的功能AR 归档维护程序的程序名默认值为 arARFLAGS 归档维护程序的选项AS 汇编程序的名称默认值为 asASFLAGS 汇编程序的选项CC C 编译器的名称默认值为 ccCFLAGS C 编译器的选项CPP C 预编译器的名称默认值为$(CC) -ECPPFLAGS C 预编译的选项CXX C编译器的名称默认值为 gCXXFLAGS C编译器的选项
较常用的是前三个对上面命令的升级版
CCgcc
EXECmain$(EXEC):main.o fun.o$(CC) $^ -o $
main.o:main.c$(CC) -c $ -o $
fun.o:fun.c$(CC) -c $ -o $
clean:rm $(EXEC) *.oecho $(PWD)上面的代码可以发现7、8行代码重复因此可以合并使用通配符 %
CCgcc
EXECmain
OBJmain.o fun.o // 将依赖文件通过自定义变量保存 $(EXEC):$(OBJ)$(CC) $^ -o $
%.o:%.c$(CC) -c $ -o $
clean:rm $(EXEC) $(OBJ)echo $(PWD)