电子商务网站规划的流程,筑招建筑人才网长春安全员,展会展厅设计制作公司,福州小程序定制目录 1.背景2.make指令输入make默认为Makefile文件第一条指令执行Makefile文件对gcc指令特殊处理及原理特殊符号 3.总结 1.背景 会不会写makefile#xff0c;从一个侧面说明了一个人是否具备完成大型工程的能力一个工程中的源文件不计数#xff0c;其按类型、功能、模块分别放… 目录 1.背景2.make指令输入make默认为Makefile文件第一条指令执行Makefile文件对gcc指令特殊处理及原理特殊符号 3.总结 1.背景 会不会写makefile从一个侧面说明了一个人是否具备完成大型工程的能力一个工程中的源文件不计数其按类型、功能、模块分别放在若干个目录中makefile定义了一系列的规则来指定哪些文件需要先编译哪些文件需要后编译哪些文件需要重新编译甚至于进行更复杂的功能操作makefile带来的好处就是——“自动化编译”一旦写好只需要一个make命令整个工程完全自动编译极大的提高了软件开发的效率。make是一个命令工具是一个解释makefile中指令的命令工具一般来说大多数的IDE都有这个命令比如Delphi的makeVisual C的nmakeLinux下GNU的make。可见makefile都成为了一种在工程方面的编译方法。make是一条命令makefile是一个文件两个搭配使用完成项目自动化构建。 2.make指令
我们使用vim编辑器创建了test.c文本文件编译了如下代码
#include stdio.h
int main()
{
printf(hello Makefile\n);
return 0;
}输入指令
gcc -o mytest test.c//编译允许代码Xshell演示结果如下 这个编译运行可执行程序过程还算简单那如果需要代码代码预处理、编译、汇编、链接生成可执行程序等等过程的时候那么就需要输入如下指令 gcc -E test.c -o test.i #预处理
gcc -S test.i -o test.s #编译
gcc -c test.s -o test.o #汇编
gcc test.o -o test #生成可执行程序
./test #找到对应路径下可执行程序运行使用完之后或者发生错误需要删除文件
rm -rf test.i test.s test.o testXshell演示结果如下 上面的指令输入一次还算简单假设你的代码需要多次修改就需要重复输入预处理、编译、汇编、链接、删除指令会很麻烦这时候我们就需要使用到Makefile文件/makefile文件首字母m大小写都可以。 使用vim编辑器创建Makefile文件向里面编入如下指令
test:test.ogcc test.o -o test
test.o:test.sgcc -c test.s -o test.o
test.s:test.igcc -S test.i -o test.s
test.i:test.cgcc -E test.c -o test.i
clean:rm -rf test test.o tes.s test.iXshell演示结果如下 ①test:test.o为依赖关系即test文件生成需要依赖于test.c文件该指令写在行首gcc test.o -o test 为依赖方法通过gcc指令处理test.o文件得到test文件该指令前有一个tab键的空格所以必须要有test.o文件而test.o文件的生成依赖于test.s文件test.s文件依赖于test.i文件test.i文件依赖于test.c文件依赖关系后面伴随着依赖实现方法由此可以看出test文件需要依靠层层依赖关系以及依赖方法才能得到像递归一样②而clean指令后面为空格无依赖关系表明clean不依赖于任何文件、指令同时有自己的依赖实现方法。 输入make默认为Makefile文件第一条指令执行
指令实现顺序如下 只输入make指令 指令实现顺序如下 只输入make指令 ①只输入make指令只会执行Makefile文件实现的第一条指令从上到下一般我们程序执行指令放在作为Makefile文件的第一条指令其他指令通过makeMakefile指令/文件名实现 ②Makefile文件的各文件依赖关系指令可以在任意位置不一定是从上到下系统会在Makefile文件中找到得到目标文件需要实现的依赖方法所以对应的依赖关系缺失会导致指令运行不起来总而言之就是make会自动推导Makefile中的依赖关系栈式结构 Makefile文件对gcc指令特殊处理及原理
为什么进行编译拦截 我们使用make指令对test文件进行多次编译运行发现只有第一次make指令被执行了再次输入make指令却不被执行这是为什么呢就像机器提示那样test文件没有更新所以不需要进行多次编译为什么机器会对我们的多次编译的指令进行拦截呢多次编译消耗时间会使Linux机器的工作效率大大降低我们现在之所以没有感受出来是因为写的代码太少了当程序代码量很大的时候编译一次编译需要消耗几十分钟、几个小时甚至更久我相信对同样的代码编译多次的行为作为程序员的你是第一个不答应的 怎么做到对相同源文件只做一次编译呢 一般情况下是由源文件生成可执行文件即先有源文件才有可执行文件所以源文件最近修改时间比可执行文件早老。如果我们更改了源文件此时源文件的修改时间比旧的可执行文件晚所以此时我们使用make指令就可以将修改后的源代码重新编译生成新的可执行文件。该过程是怎么样的呢接下来让我们认识一条指令 stat指令 语法stat 选项 文件名 功能 显示文件\文件系统的详细信息包括文件的访问时间文件内容修改时间文件属性的修改时间。 ①Access文件的访问时间查看、修改文件内容都可以算访问Access显示的时间更新Modify文件内容修改时间只有对文件内容进行增删等修改文件内容操作Modify时间更新Change文件属性的修改时间文件大小、文件拥有者、文件所属组等文件属性修改Change显示时间会被更新。②文件内容修改一次Modify显示的时间会被更新文件属性内容修改一次Change显示的时间会被更新因为平时我们访问文件的次数比较频繁所以访问文件达到一定次数Access显示的时间才会被更新。③修改源文件内容而引起的时间变化源文件是否被编译比较源文件和可执行文件的是Modify显示的时间。 使用touch指令更新时间 指令1 touch -a 文件名使用该指令更新文件的Access显示的时间、Change显示的时间 指令2 touch -m 文件名使用该指令更新文件的Modify显示时间 先使用touch -m 文件名更新源文件的Modify显示时间然后使用make指令重新编译源文件 特殊符号 使用特殊符号 使用之后 $表示冒号左边的文件名$^表示冒号右边的文件名在Makefile文件可以使用放在语句前进行注释 使用.PHONY将目标文件成为伪目标 使用.PHONY可以将test指令文件变成伪目标使该指令文件总是被执行一般情况我们将clean指令文件设置为伪目标 3.总结 1make会在当前目录下找名字叫“Makefile”或“makefile”的文件。 2. 如果找到它会找文件中的第一个目标文件target在上面的例子中他会找到“test”这个文件并把这个文件作为最终的目标文件。 3. 如果test文件不存在或是test所依赖的后面的test.o文件的文件修改时间要比test这个文件新就会执行后面所定义的命令来生成test这个文件。 4. 如果test所依赖的test.o文件不存在那么make会在当前文件中找目标为test.o文件的依赖性如果找到则再根据那一个规则生成test.o文件。这有点像一个堆栈的过程 5. test.o的依赖方法存在make会生成test.o文件然后再用 test.o 文件声明make的终极任务也就是执行test文件了。 6. make的依赖性make会一层又一层地去找文件的依赖关系直到最终编译出第一个目标文件。 7. 在找寻的过程中如果出现错误比如最后被依赖的文件找不到那么make就会直接退出并报错而对于所定义的命令的错误或是编译不成功make不执行。 8. make只管文件的依赖性即如果在make找到依赖关系之后冒号后面的文件还是不在make不执行 9.工程是需要被清理的像clean这种指令没有被第一个目标文件直接或间接关联那么它后面所定义的命令将不会被自动执行可以显示要make执行。即命令——“make clean”以此来清除所有的目标文件以便重编译。 10.一般我们将clean的目标文件设置为伪目标用 .PHONY 修饰伪目标的特性是总是被执行的。 11.make指令会判定文件的新旧判定是否需要重新进行执行依赖关系进行编译