makefile 头文件路径文件的几个要素

● makefile文件&&&&& make是一个命令,makefile是一个文件。make命令执行时,需要一个 Makefile 文件,以告诉make命令需要怎么样的去编译和链接程序。一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为makefile就像一个Shell脚本一样,其中也可以执行操作系统的命令。makefile 带来的好处就是------“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。下面进行具体说明。1、建立test.h、test.c和main.c文件2、如果不建立makefile文件,我们就需要依次进行编译链接3、编写makefile文件一旦改变了某一文件的程序,就需要重新进行上述操作,太过繁琐,于是我们建立makefile文件进行自动化编译,包括自动清除所有编译结果。650) this.width=650;" title="makefile.png" alt="wKioL1dOVF2Cm3cxAACGkUOfaU4314.png-wh_50" src="/wyfs02/M00/82/32/wKioL1dOVF2Cm3cxAACGkUOfaU4314.png-wh_500x0-wm_3-wmp_4-s_.png" />注:在依赖方法那行,一定要以Tab键开头。“.PHONY”表示,clear是个伪目标文件。● make的工作原理&&&&& 在默认的方式下,也就是我们只输入make命令,那么make会进行以下步骤。1、make会在当前目录下找名字叫“Makefile”或“makefile”的文件。2、如果找到,它会找文件中的第一个目标文件(target),在上面的例子中,他会找到“edit”这个文件,并把这个文件作为最终的目标文件。3、如果edit文件不存在,或是edit所依赖的后面的 .o 文件的文件修改时间要比edit这个文件新,那么,他就会执行后面所定义的命令来生成edit这个文件。4、如果edit所依赖的.o文件也不存在,那么make会在当前文件中找目标为.o文件的依赖性,如果找到则再根据那一个规则生成.o文件。(这有点像一个堆栈的过程)5、当然,你的C文件和H文件是存在的啦,于是make会生成 .o 文件,然后再用 .o 文件生命make的终极任务,也就是执行文件edit了。这就是整个make的依赖性,make会一层又一层地去找文件的依赖关系,直到最终编译出第一个目标文件。》》》输入make命令输入make命令后自动生成了-i,-s,-o和main文件。》》》输入make clear命令在依赖关系前加@,可屏蔽细节》》》ctags:linux代码查看&&&&&& ctags是vim下方便代码阅读的工具。尽管ctags也可以支持其它编辑器,但是它正式支持的只有VIM。并且VIM中已经默认安装了Ctags,它可以帮助程序员很容易地浏览源代码。&&&&&& 如果没有安装ctags,先进行ctags的安装,安转后在指定的源码位置生成tags文件,例如ctags test.c再ls会存在tags文件,该文件存放了test.c的源代码。650) this.width=650;" title="ctags.png" alt="wKioL1dOVkTisLqJAAAuE1yJmPs622.png-wh_50" src="/wyfs02/M00/82/32/wKioL1dOVkTisLqJAAAuE1yJmPs622.png-wh_500x0-wm_3-wmp_4-s_.png" />&&&&& 我们查看tags内容就可以发现,原来tags就是linux内核代码中各个元素的索引,这也就是ctags结合vim可以快速进行定位的原因了(查询就是通过这个文件内容来定位的)。》》》cat 文件名cat主要有三大功能:1.一次显示整个文件。$ cat&filename2.从键盘创建一个文件。$ cat&&&filename&&&& 只能创建新文件,不能编辑已有文件.3.将几个文件合并为一个文件: $cat&file1&file2 & file例如:cat test.c 显示test.c代码本文出自 “” 博客,请务必保留此出处
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:15740次
排名:千里之外
原创:120篇
(1)(1)(9)(14)(97)<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
您的访问请求被拒绝 403 Forbidden - ITeye技术社区
您的访问请求被拒绝
亲爱的会员,您的IP地址所在网段被ITeye拒绝服务,这可能是以下两种情况导致:
一、您所在的网段内有网络爬虫大量抓取ITeye网页,为保证其他人流畅的访问ITeye,该网段被ITeye拒绝
二、您通过某个代理服务器访问ITeye网站,该代理服务器被网络爬虫利用,大量抓取ITeye网页
请您点击按钮解除封锁&博客访问: 2161985
博文数量: 409
博客积分: 10227
博客等级: 上将
技术积分: 8652
注册时间:
认证徽章:
非淡泊无以明志,非宁静无以致远
IT168企业级官微
微信号:IT168qiye
系统架构师大会
微信号:SACC2013
分类: LINUX
Makefile中,规则描述了在何种情况下使用什么命令来重建一个特定的文件,此文件被称为规则“目标”(通常规则中的目标只有一个)。规则中除了目标之外的罗列的其它文件称为“目标”的依赖,而规则的命令是用来更新或者创建此规则的目标。
除了makefile的“终极目标”所在的规则以外,其它规则的顺序在makefile文件中没有意义。“终极目标”就是当没有使用make 命令行指定具体目标时,make默认的更新的那一个目标。它是makefile文件中第一个规则的目标。如果在makefile中第一个规则有多个目标的话,那么多个目标中的第一个将会被作为make的“终极目标”。有两种情况的例外:&&&&&&&& 1)目标名以点号“.”开始的并且其后不存在斜线“/”(“./”被认为是当前目录;“../”被认为是上一级目录);
2)模式规则的目标。当这两种目标所在的规则是Makefile的第一个规则时,它们并不会被作为“终极目标”。
“终极目标”是执行make的唯一目的,其所在的规则作为第一个被执行的规则。而其它的规则是在完成重建“终极目标”的过程中被连带出来的。所以这些目标所在规则在Makefile中的顺序无关紧要。
因此,我们书写的makefile的第一个规则应该就是重建整个程序或者多个程序的依赖关系和执行命令的描述。
2. 一个例子
我们来看一个规则的例子:
: foo.c defs.h&&&&&& # module for
twiddling the frobs
&&&&&&&& cc
-c -g foo.c
&这是一个典型的规则。看到这个例子,大家应该能够说出这个规则的各个部分之间的关系。不过我们还是要把这个例子拿出来讨论。目的是让我们更加明确地理解Makefile的规则。本例第一行中,文件“foo.o”是规则需要重建的文件,而“foo.c”和“defs.h”是重建“foo.o”所要使用的文件。我们把规则所需要重建的文件称为规则的“目标”(foo.o),而把重新目标所需要的文件称为规则的“依赖”(或者目标的依赖)。规则中的第二行“cc -c -g foo.c”是规则的“命令”。它描述了如何使用规则中的依赖文件重建目标。
而且,上面的规则告诉我们了两件事:
1)如何确定目标文件是否过期(需要重建目标),过期是指目标文件不存在或者目标文件“foo.o”在时间戳上比依赖文件中的任何一个(“foo.c”或者“defs.h”)“老”。
2)如何重建目标文件“foo.o”。这个规则中使用cc编译器。规则的命令中没有明确的使用到依赖文件“defs.h”。我们假设在源文件“foo.c”中已经包含了此头文件。这也是为什么它作为目标依赖出现的原因。
3. 规则语法
通常规则的语法格式如下:
&TARGETS : PREREQUISITES
&&&&&&&& COMMAND
&TARGETS : PREREQUISITES ; COMMAND
&&&&&&&& COMMAND
&规则中“TARGETS”可以是空格分开的多个文件名,也可以是一个标签(例如:执行清空的“clean”)。“TARGETS”的文件名可以使用通配符。通常规则只有一个目标文件(建议这么做),偶尔会在一个规则中需要多个目标。
书写规则是我们需要注意的几点:
1)规则的命令部分有两种书写方式:
a. 命令可以和目标:依赖描述放在同一行。命令在依赖文件列表后并使用分号(;)和依赖文件列表分开。
b. 命令在目标:依赖的描述的下一行,作为独立的命令行。当作为独立的命令行时此行必须以[Tab]字符开始。在Makefile中,在第一个规则之后出现的所有以[Tab]字符开始的行都会被当作命令来处理。
2)Makefile中符号“$”有特殊的含义(表示变量或者函数的引用),在规则中需要使用符号“$”的地方,需要书写两个连续的(“$$”)。
3)前边已提到过,对于Makefile中一个较长的行,我们可以使用反斜线“\”将其书写到几个独立的物理行上。虽然make对Makefile文本行的最大长度是没有限制的,但还是建议这样做。不仅书写方便而且更有利于别人的阅读(这也是一个程序员修养的体现)。
4. 一个规则告诉“make”两件事:
1)目标在什么情况下已经过期;
2)如果需要重建目标时,如何去重建这个目标。目标是否过期是由那些使用空格分割的规则的依赖文件所决定的。当目标文件不存在或者目标文件的最后修改时间比依赖文件中的任何一个晚时,目标就会被创建或者重建。就是说执行规则命令行的前提条件是以下两者之一:1)目标文件不存在; 2)目标文件存在,但是规则的依赖文件中存在一个依赖的最后修改时间比目标的最后修改时间晚。
规则的中心思想是: 目标文件的内容是由依赖文件文件决定,依赖文件的任何一处改动,将导致目前已经存在的目标文件的内容过期。规则的命令为重建目标提供了方法。这些命令运行在系统shell之上。
阅读(206) | 评论(0) | 转发(0) |
相关热门文章
给主人留下些什么吧!~~
请登录后评论。  通常我们在命令行使用GCC对程序进行编译,如果对于单个或者几个文件时比较方便的,但当工程中的文件逐渐增多甚至变得十分庞大的时候,使用GCC显然力不从心,不好管理。因此我们有必要编写一个Makefile来对工程进行管理。就以下工程目录进行学习。
生成可执行程序cacu,建立如下规则的Makefile文件。
#生成test,":"左边为目标,右边为依赖 。gcc后是命令
cacu:add_int.o add_float.o sub_int.o sub_float.o main.o
gcc -o cacu add/add_int.o add/add_float.o \ (连接符)
sub_int.o sub_float.o main.o
#生成add_int.o的规则
add_int.o:add/add_int.c add/add_int.h
gcc -c -o add/add_int.o add/add_int.c
#生成add_float.o的规则
add_float.o:add/add_float.c add/add_float.h
gcc -c -o add/add_float.o add/add_float.c
#生成sub_int.o的规则
sub_int.o:sub/sub_int.c sub/sub_int.h
gcc -c -o sub/sub_int.o sub/sub_int.c
#生成sub_float.o的规则
sub_float.o:sub/sub_float.c sub/sub_float.h
gcc -c -o sub/sub_float.o sub/sub_float.c
#生成main.o的规则
main.o:main.c add/add.h sub/sub.h
gcc -c-o main.o main.c -Iadd -Isub
#清理的规则
rm -f test add_int.o add_float.o sub_int.o \
sub_float.o main.o
Makefile的规则:Makefile的框架是由规则构成的,make命令执行时,先在Makefile文件中查找各种规则,对各种规则进行解析后,运行规则。规则的基本格式为TARGET... :DEPENDEDS...&& &COMAND&& &&&&& &&&TARGET:规则所定义的目标。通常规则是最后生成的可执行文件的文件名或者为了生成可执行文件而依赖的目标文件的文件名,也可以是一个动作,称之为。伪目标。DEPENDEDS:执行此规则所必须的依赖条件,例如生成可执行文件的目标文件。DEPENDEDS也可以是某个TARGET,这样就形成了TARGET之间的嵌套。COMMAND:规则所执行的命令,即规则的动作,例如编译文件、生成库文件、进入目录等。动作可以是多个,每个命令占一行。规则的形式比较简单,要写好一个MakeEle需要注意一些地方,并对执行的过程有所了解。1.规则的书写在书写规则的时候,为了使Make租e更加清晰,要用反斜杠(\)将较长的行分解为多行, 例如将"rm-fcacu add/add_int. o add/add_tloat. o sub/sub_int. o sub/sub_float. o main. o"分解为了两行。命令行必须以Tab键开始,m工程序把出现在一条规则之后的所有连续的以Tab键开始的行都作为命令行处理。注意:规则书写时要注意COMMAND的位置,COMMAND前面的空白是一个Tab键,不是空格。Tab告诉make这是一个命令行,make执行相应的动作。2.目标Makefile的目标可以是具体的文件,也可以是某个动作。例如目标cacu就是生成cacu的规则,有很多的依赖项,及相关的命令动作。而clean是清除当前生成文件的一个动作,不会生成任何目标项。3.依赖项依赖项是目标生成所必须满足的条件,例如生成cacu需要依赖main.o,main.o必须存在才能执行生成cacu的命令,即依赖项的动作在TARGET的命令之前执行。依赖项之间的顺序按照自左向右的顺序检查或者执行。例如,下面的规则
main. o main. c add/add. h sub/sub. h  gcc-c-o main. o main. c-ladd-Isubmain.c、add/add.h和sub/sub.h必须都存在才能执行动作。gcc-c-omaiH.o main.c -ladd -lsub。。,当add/add.h不存在时,是不会执行规则的命令动作的,而且也不会检查sub/sub.h文件的存在,当然main.c由于在add/add.h依赖项之前,会先确认此项没有问题。
4.规则的嵌套规则之间是可以嵌套的,这通常通过依赖项实现。例如生成cacu的规则依赖于很多的.o文件,而每个.o文件又分别是一个规则。要执行规则cacu必须先执行它的依赖项,即add_int.o、add_float.o、sub_int.o、sub_float.o、main.o,这5个依赖项生成或者存在之后才进行cacu的命令动作。5.文件的时间戳make命令执行的时候会根据文件的时间戳判定是否执行相关的命令,并且执行依赖于此项的规则。例如对main.c文件进行修改后保存,文件的生成日期就发生了改变,再次调用make命令编译的时候,就会只编译main.c,并且执行规则cacu,重新链接程序。6、执行的规则在调用make命令编译的时候,m工程序会査找MakeEle文件中的第1个规则,分析并执行相关的动作。例子中的第1个规则为cacu,所以m工程序执行cacu规则。由于其依赖项包含5个,第1个为add_int.o,分析其依赖项,当add/add_int.c add.h存在的时候,执行如下命令动作:gcc-c-o addladd_int. o add/add_int. c当命令执行完毕的时候,会按照顺序执行第2个依赖项,生成add/add_flaot.o.当第5个依赖项满足时,即main.o生成的时候,会执行cacu的命令,链接生成执行文件cacu.当把规则clean放到第一个的时候,再执行make命令不是生成cacu文件,而是清理文件。要生成cacu文件需要使用如下的make命令。Debain #make cacu7.模式匹配在上面的Makefile中,main.o规则的书写方式如下main. o :main. c add/add. h sub/sub. h&& &gcc-c-o main. o main. c-Iadd-Isub有一种简便的方法可以实现与上面相同的功能main. o :%o %c&& &gcc-c $&-o $@这种方法的规则main.o中依赖项中的。%o:%c。的作用是将TARGET域的.o的扩展名替换为.c,即将main.o替换为main.c.而命令行的S〈表示依赖项的结果,即main.c$@表示TARGET域的名称,即main.o。
在Makefile中使用用户自定义变量
定义OBJS变量表示目标文件:
  OBJS = add_int.o add_float.o sub_int.o sub_float.o main.o
在调用OBJS的时候在前面加上$,并且变量的名称可以用括号括起来。例如,使用gcc的默认规则进行编译,cacu的规则可以采用如下形式
  cuca:gcc -o cacu $(OBJS)
用CC表示gcc,用CFLAGS表示编译选项,RM表示rm -f ,TARGET表示最终的生成目标cacu。
CC = gcc          (CC定义成为gcc)CFLAGS = -Isub -Iadd    (加入头文件搜索路径sub,add文件夹)TARGET = cacu       (最终生成的目标)RM = rm -f         (删除的命令)
这样,之前冗长的Makefile可以简化为如下形式。
1 CC = gcc
2 CFLAGS = -Isub -Iadd -O2  (O2为优化)
3 OBJS = add_int.o add_float.o sub_int.o sub_float.o main.o
4 TARGET = cacu
5 RM = rm -f
6 $(TARGET):$(OBJS)
7   $(CC) -o $(TARGET) $(OBJS) $(CFLAGS)
8 $(OBJS):%.o:%.c  (将OBJS中所有扩展名为.o的文件替换成扩展名为.c的文件)
9   $(CC) -c $(CFLAGS) $& -o $@  (生成目标文件)
11   -$(RM) $(TARGET) $(OBJS)  - 表示忽略错误
&由于CC的默认值已经为cc,RM的默认值为 rm -f,因此,如果在调用这些变量的时候未显式给出变量的定义,编译器就去调用其默认值。经过简化,可以得到以下形式:
1 CFLAGS = -Isub -Iadd -O2  (O2为优化)
2 OBJS = add_int.o add_float.o sub_int.o sub_float.o main.o
3 TARGET = cacu
4 $(TARGET):$(OBJS)
5    $(CC) -o $(TARGET) $(OBJS) $(CFLAGS)
$(OBJS):%.o:%.c  (将OBJS中所有扩展名为.o的文件替换成扩展名为.c的文件)
  $(CC) -c $(CFLAGS) $& -o $@  (生成目标文件)
  -$(RM) $(TARGET) $(OBJS)  - 表示忽略错误
Makefile很智能(会自动推导,使用默认的方式生成目标文件),可以再简化,就可以得到如下形式:
1 CFLAGS = -Isub -Iadd -O2  (O2为优化)
2 OBJS = add_int.o add_float.o sub_int.o sub_float.o main.o
3 TARGET = cacu
4 $(TARGET):$(OBJS)
5    $(CC) -o $(TARGET) $(OBJS) $(CFLAGS)
7   -$(RM) $(TARGET) $(OBJS)  - 表示忽略错误
Makefile之博大精深,暂时学习到这里(待续)。。。。
阅读(...) 评论()如何用makefile编译多个目录之间的.h .c文件呢
[问题点数:100分]
如何用makefile编译多个目录之间的.h .c文件呢
[问题点数:100分]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
2013年6月 Linux/Unix社区大版内专家分月排行榜第二2013年5月 Linux/Unix社区大版内专家分月排行榜第二2013年3月 Linux/Unix社区大版内专家分月排行榜第二2013年1月 Linux/Unix社区大版内专家分月排行榜第二2012年12月 Linux/Unix社区大版内专家分月排行榜第二2012年8月 Linux/Unix社区大版内专家分月排行榜第二2011年12月 Linux/Unix社区大版内专家分月排行榜第二2011年10月 C/C++大版内专家分月排行榜第二2011年10月 Linux/Unix社区大版内专家分月排行榜第二
2012年6月 C/C++大版内专家分月排行榜第三2012年6月 PHP大版内专家分月排行榜第三2012年5月 C/C++大版内专家分月排行榜第三2012年3月 Linux/Unix社区大版内专家分月排行榜第三2012年2月 Linux/Unix社区大版内专家分月排行榜第三2011年11月 C/C++大版内专家分月排行榜第三
本帖子已过去太久远了,不再提供回复功能。

我要回帖

更多关于 makefile 头文件 的文章

 

随机推荐