怎么编写makefile
来源:互联网 发布:中国大学生失业率数据 编辑:程序博客网 时间:2024/05/21 20:25
写的makefile的总结,可惜电脑中途死机一半的内容都丢失了,还是决定放出来希望能对大家有点借鉴意义
c文件经过编译之后生成 .0文件
1,如果所有的c文件都没有被编译过那么将会编译所有源文件
2,在上一次make之后源文件被改动过的将会重新编译
3,头文件在上次make之后被修改过的话,会重新编译所有包含他的源文件
makefile中每一个命令必须以tab开始,这样是告诉makefile这是一条命令
下面一个简单的例子
(一个头文件,两个源文件,和一个makefile文件)
文件内容如下:
file.h
#ifndef FILE_H_#define FILE_H_#ifdef __cplusplusextern "C" {#endifvoid File2Print();#ifdef __cplusplus}#endif#endif
file.c
#include <stdio.h>#include "file.h"int main() { printf("print file1$$$$$$$$$$$$$$$$$$$$$$$$\n"); File2Print(); return 0;}
file2.c
#include <stdio.h>#include "file.h"void File2Print() { printf("Print file2**********************\n");}
makefile
start:file1.o file2.o gcc file1.o file2.o -o filefile1.o:file1.c file.h gcc -c file1.cfile2.o:file2.c file.h gcc -c file2.cclean:
在这个makefile文件中,我们的target就是可执行文件file和file1.o ,file2.o两个编译文件
而file1.o 又依赖于file1.c ,file.h
file2.o 依赖于file2.c ,file.h
target后面的命令就是用于生成target目标文件的命令
clean是伪目标:makefile文件中将没有任何依赖只有执行动作的目标成为伪目标
makefile文件中使用变量
obj = file1.o file2.ostart:$(obj) gcc $(obj) -o filefile1.o:file1.c file.h gcc -c file1.cfile2.o:file2.c file.h gcc -c file2.cclean: rm -f *.o file
源代码和头文件已上面的例子相同,这里我们将 .o文件赋值给obj这个变量,这样我们在需要这些.o文件的时候直接引用obj这个变量就行了
这样的好处是,当源代码文件增加或删除了我们只需要修改一下obj变量就行,而不需要多次修改避免了由于粗心而可能产生的错误
自动推导规则
同样的例子makefile文件还可以这么写,这个makefile文件中我们去掉了file1.o file2.o 两个目标的命令,但是依然能够生成file1.o 和file2.o两个目标文件 ,之所以这样是以为makefile的自动推导规则(即:file1.o和file2.o会分别对应file1.c 和file2.c两个源文件,这是makefile的隐含规则)
obj = file1.o file2.ostart:$(obj) gcc $(obj) -o filefile1.o:file1.c file.hfile2.o:file2.c file.hclean: rm -f *.o file
makefile文件可以使用include包含其他makefile文件
使用include的时候如果出错会马上退出make
如果使用 <-include)>的话则会忽略错误
VPATH
makefile可以识别特殊变量VPATH通过VPATH可以指定依赖或目标的搜索路径,如果当前目录不存在需要的目标文件或依赖文件时,会自动到VPATH指定的目录寻找
以上面的图片为例,加入存在 foo:foo.c 如果当前目录不存在foo.c那么会到src和headers目录中查找,如果文件在src中,则上面的代码等同于 foo:src:/foo.c
关键字vpath
上面例子中 PATTERN表示具有相同特征的一类文件,而DERECTORIES则指定了搜索文件的目录。当依赖文件列表中的文件不能在当前目录中找到时,makefile会依次在DIRECTORY目录中查找依赖文件。
例:
vpath %.h ../header
表示makefile中出现的“.h”文件如果不能在当前目录下找到则到../header中查找
makefile中有一个内嵌隐含变量 RM它被定义为 RM=rm -f
所以可以使用 $(RM)
在命令的前面加一个减号,可以确保及时命令失败也不会退出程序
export
如果一个变量使用export那么这个变量会传递给子makefile,例:
export VARIABLE=value
变量VARIABLE在子makefile中也可以使用
新版本中使用.EXPORT_ALL_VARIABLE代替exprot
MEKELEVEL表示调用目录的深度
3.9.1
- 怎么编写makefile
- 怎么看懂和编写makefile
- Makefile是什么?如何编写?怎么写能通用呢?
- 编写Makefile
- Makefile编写
- makefile编写
- makefile 编写
- makefile编写
- Makefile 编写
- makefile编写
- Makefile编写
- 编写Makefile
- Makefile编写
- makefile编写
- Makefile 编写
- Makefile编写
- Makefile编写
- 编写Makefile
- 数据结构--数组
- android中的键值对
- 终端命令
- android.content.ActivityNotFoundException: No Activity found to handle Intent
- CUDA总结:线程网络和线程分配
- 怎么编写makefile
- 216. Combination Sum III
- 数据结构期末总结
- Mysql日期类型
- 二:Hibernate映射机制
- Android开发中这些小技巧你都知道吗?(一)
- oracle linux 7 安装oracle 12c
- Android四大组件—Service
- 虚拟机系统安装详细步骤(图文)