一起来写makefile
来源:互联网 发布:java面试编程题 编辑:程序博客网 时间:2024/04/29 23:51
Linux环境下的大型项目开发中,通常把整个系统划分为若干模块,每个模块完成某一相对独立的功能,各个模块相互作用以构成一个完整的系统。对于这样一个软件系统,是不可能只使用一条或几条gcc命令就可以编译生成可执行程序的。在Linux中,有一个用来维护程序模块关系和生成可执行程序的工具-----make。它可以根据程序模块的修改情况重新编译链接生成中间代码或最终的可执行程序。执行make命令,需要一个名为“Makefile”或“makefile”的文本文件,这个文件定义了整个项目的编译规则。它定义了模块间的依赖关系,指定文件的编译顺序,以及编译所使用的命令。有了make命令和makefile文件,整个项目的源程序文件可以自动编译,极大地提高了软件开发效率。
make的一般使用
make从makefile文件中获取模块间的依赖关系,判断哪些文件过时了,根据这些信息make确定哪些文件需要重新编译,然后使用makefile中的编译命令进行编译。所谓过时,是指一个文件生成后,用来生成该文件的源文件或头文件被修改了,导致生成该文件所需要的源文件或头文件的修改时间比生成该文件的时间晚。
下面是一个简单的makefile文件:
main:main.o module1.o module2.o gcc main.o module1.o module2.o -o mainmain.o:main.c head1.h head2.h common_head.hgcc -c main.cmodule1.o:module1.c head1.hgcc -c module1.cmodule2.o:module2.c head2.hgcc -c module2.c#This is a makefile
Makefile的基本构成
Makefile文件的基本单元是规则。一条规则指定一个或多个目标文件,目标文件后面跟的是编译生成该目标文件所依赖的文件或模块,最后是生成或更新目标文件所使用的命令。规则的格式如下:
目标文件列表 分隔符 依赖文件列表[;命令][命令][命令]
其中,“[ ]”中的内容是可选的。
在上面的Makefile文件中,第一、二行就构成了一条规则。目标文件列表中只有一个目标文件即main。main后面的冒号(:)是分隔符,一般分隔符都是冒号,其他分隔符很少使用。依赖文件列表是main.o module1.o module2.o,也就是为了生成可执行程序main,需要先生成这些依赖文件。这些依赖文件是以.o结尾的,说明它们是一些只经过编译和汇编,没有进行过链接的中间代码。
第二行是生成目标文件所使用的命令。需要特别注意的是,如果某一行是命令,那么它必须以一个Tab键开头。另外,如果某一行以Tab键开头,make就认为这一行是命令。第一行用于指明模块间的依赖关系,不是命令,因此不以Tab键开头。第三五七行与第一行类似,因此也都不以Tab键开头。第三四两行也构成了一条规则,它指明main.o这个目标文件依赖于main.c源程序文件和三个头文件。生成main.o目标文件所使用的命令是gcc -c main.o。
最后一行以#开头,是注释行,Makefile文件中,如果某行以#开头,那么make就认为它是一行注释,因而就不会解析这行内容。
其他说明
命令行之间可以插入任意多个空行,空行也要按Tab键开头。
如果某一行过长,可以在达到这一行行末前输入一个反斜杠(\)。由反斜杠连接起来的多行都被当做一行处理。反斜杠与新的一行之间不要有空白。
Makefile也可以命令为makefile。还可以命名为其他任意合法的文件名,如果命名为其他名字,在执行make时,应按照如下方法之一告诉make哪个是makefile文件。
[root@mci tmp]#make -f othername[root@mci tmp]#make --file=othername
如果所有文件都不需要更新,make不会执行编译命令,它会在屏幕上输出类似以下的提示信息:
make:"main"是最新的
通常make把Makefile文件中的第一个规则中的目标文件作为最终目标文件(又称为终极目标)。如果第一条规则中有多个目标文件(即冒号前的多个文件),make把这些目标文件中的第一个作为最终目标文件。通常最终目标文件是最后要编译生成的可执行文件。其他规则中的目标文件都是为了产生最终目标文件而生成的中间文件。因此,在编写Makefile文件时,一般也把最后要生成的文件放在第一条规则的目标文件列表中。
Makefile文件的构成
一个完整的Makefile文件由五部分构成:显示规则、隐式规则、使用变量、文件指示和注释。
下面是自己写的一个简单的makefile的小练习:
(1)file1.c
#include <stdio.h>void func(){ printf("Hello world!\n");}(2)file2.c
#include <stdio.h>int main(){ func(); return 0;}(3)makefile
main:file1.o file2.o gcc file1.o file2.o -o maintest1.o:file1.c gcc -c file1.ctest2.o:file2.c gcc -c file2.c
执行make命令就开始自动编译,命令行出现:
cc -c -o file1.o file1.ccc -c -o file2.o file2.cgcc file1.o file2.o -o main运行该程序,输入./main
Hello world!
- 一起来写makefile
- 一起来学Makefile、make
- 大家一起来写Model
- 一起来写个弹幕
- 一起来学Makefile(一)
- 写 Makefile!
- 写Makefile
- 写Makefile
- 写makefile
- 一起来写2048(160行python代码)
- 大家一起来写程序预测股价走势
- 一起来写web server 00 -- 准备工作
- 一起来写web server 03 -- 多线程版本
- 一起来写web server 09 -- 最终版本
- 一起来写ftp server 01 -- 简易版本
- 一起来写ftp server 03 -- 加强版本
- 一起来写一个简易的手风琴效果
- 一起来写OKHttp的拦截器
- PLSQLDeveloper连接数据库
- Mac环境Sublime text2解决中文乱码的问题
- Microsoft Message Queuing介绍
- POJ 2585 zoj 2193 Window Pains
- Android蓝牙通讯模块源码(Android蓝牙开发浅析 续)
- 一起来写makefile
- Spiral Matrix Java
- 请喊我大V
- 窗口句柄,进程ID,进程句柄,线程ID,线程句柄
- 多媒体编程——ios视频图像绘制(1)
- poj 2128 Highways
- shapefile格式说明及读写代码示例
- python模仿POST提交HTTP数据以及使用Cookie值
- Vision引擎中环境地形介绍