您的位置 首页 知识

Makefile方针,伪方针,头文件主动依靠

Makefile目标,伪目标,头文件自动依赖-all 是所有目标的伪目标,功能是编译所有目标clean 删除所有被make创建的文件install 安装已经编译好的程序,其实就是把目标执行文件拷贝到指定目标中print 这个伪目标的功能是列出改变过的源文件tar 把源程序打包备份,就是一个tar文件dist 创建一个压缩文件,一般吧tar文件压缩成Z文件或gz文件TAGS 更新所有目标,以备完整的重编译使用check/test 测试makefile流程

方针

即咱们终究要生成的文件,make默许生成第一个方针,留意 makefile中tab和空格不是一回事,规矩运用tab缩进,编辑器不要设置比如“将tab替换为空格之类的选项”,方针的结构如下

方针:依靠1 依靠2生成方针的规矩

伪方针

无论如何也要履行的方针,需求运用.PHONY:标识

.PHONY:cleanclean: rm -f *.o

常见伪方针

all 是一切方针的伪方针,功用是编译一切方针clean 删去一切被make创立的文件install 装置现已编译好的程序,其实便是把方针履行文件拷贝到指定方针中print 这个伪方针的功用是列出改变过的源文件tar 把源程序打包备份,便是一个tar文件dist 创立一个压缩文件,一般吧tar文件压缩成Z文件或gz文件TAGS 更新一切方针,以备完好的重编译运用check/test 测验makefile流程

比如

circle:main.o circle.o cc main.o circle.o -o circlemain.o:main.c cc -c main.ccircle.o :circle.c cc -c circle.cclean: rm *.o *.h circle

主动依靠头文件

makefile是依据依靠联系,时刻戳和生成规矩来判别哪些文件需求更新,可是咱们一般写的生成规矩并不会包括头文件,依靠联系也不会,这样假如咱们更新了头文件,makefile也不会发现,也就不会更新相应的文件,一起,考虑到头文件包括联系的复杂性,咱们在写依靠联系之前把一切的头文件理清楚再写进去也不现实,一个好的方法是使用$gcc -M或$gcc -MM功用,这两个功用能主动的剖析头文件的依靠联系,前者剖析方针文件的一切头文件依靠联系,后者剖析和咱们自定义文件的依靠联系:

$gcc -M hello.chello.o: hello.c /usr/include/stdio.h /usr/include/features.h \ /usr/include/i386-linux-gnu/bits/predefs.h \ /usr/include/i386-linux-gnu/sys/cdefs.h \ /usr/include/i386-linux-gnu/bits/wordsize.h \ /usr/include/i386-linux-gnu/gnu/stubs.h \ /usr/include/i386-linux-gnu/gnu/stubs-32.h \ /usr/lib/gcc/i686-linux-gnu/4.6/include/stddef.h \ /usr/include/i386-linux-gnu/bits/types.h \ /usr/include/i386-linux-gnu/bits/typesizes.h /usr/include/libio.h \ /usr/include/_G_config.h /usr/include/wchar.h \ /usr/lib/gcc/i686-linux-gnu/4.6/include/stdarg.h \ /usr/include/i386-linux-gnu/bits/stdio_lim.h \ /usr/include/i386-linux-gnu/bits/sys_errlist.h hello.h$gcc -MM hello.chello.o: hello.c hello.h

能够看到,他们的输出的格局刚好便是咱们写的依靠联系的格局,所以咱们能够综合使用伪方针,重定向,include关键字完成仇人文件更新的主动查看

.PHONY:allall:hello dependencyhello:hello.o gcc hello.o -o hellohello.o:hello.c gcc -c hello.c -o hello.odependency:headersheaders: gcc -M hello.c > headersinclude headers.PHONY:cleanclean: rm -rf hello *.o

剖析:make缺省方针会主动以第一个方针为方针,首要顺次查看hello<-hello.o<-hello.c发现没有文件被更新,dependency并不是一个文件,也没有时刻戳,所以也没有被更新,可是dependency每次都会履行改写headers文件,咱们又include了headers,所以一旦headers里边写的头文件有更新,就会经过hello.o<-xxx.h来找到更新联系,从而更新hello.o并进一步更新hello。至此完成了仇人文件的主动依靠问题的处理。
履行作用:

//程序便是输出这个N值#ifndef __HELLO_H__#define __HELLO_H__#define N 121220;#endif

$./hello num:121220$vi hello.h #修正头文件中N的值为5$make #公然从头编译了 gcc -c hello.c -o hello.ogcc hello.o -o hellogcc -M hello.c > headers$./hello num:5
 

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/zhishi/88643.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部