当前位置:  技术问答>linux和unix

谁有比较全的makefile的描述文档啊,要全一点的(100分)

    来源: 互联网  发布时间:2015-02-19

    本文导语:  谁有比较全的makefile的描述文档啊,要全一点的(100分) | 比较简单的 CC=cc OBJ1=a.o b.o c.o OBJ2=d.o e.o f.o OBJ3=g.o h.o i.o LIB=lib1.a lib2.a main: $(OBJ1) $(OBJ2) $(OBJ3)         $(CC) -o main $(OBJ1) $...

谁有比较全的makefile的描述文档啊,要全一点的(100分)

|
比较简单的
CC=cc
OBJ1=a.o b.o c.o
OBJ2=d.o e.o f.o
OBJ3=g.o h.o i.o
LIB=lib1.a lib2.a

main: $(OBJ1) $(OBJ2) $(OBJ3)  
      $(CC) -o main $(OBJ1) $(OBJ2) $(OBJ3) $(LIB) -lc -lsocket

a.o: a.c
     cc -c a.c
...


|
GNU Make 工具
~~~~~~~~~~~~~~~~

2.1 基本 makefile 结构

GNU Make 的主要工作是读进一个文本文件, makefile 。这个文 件里主要是有关哪些文件(‘target’目的文件)是从哪些别的 文件(‘dependencies’依靠文件)中产生的,用什么命令来进行 这个产生过程。有了这些信息, make 会检查磁碟上的文件,如果 目的文件的时间戳(该文件生成或被改动时的时间)比至少它的一 个依靠文件旧的话, make 就执行相应的命令,以便更新目的文件。 (目的文件不一定是最后的可执行档,它可以是任何一个文件。)

makefile 一般被叫做“makefile”或“Makefile”。当然你可以 在 make 的命令行指定别的文件名。如果你不特别指定,它会寻 找“makefile”或“Makefile”,因此使用这两个名字是最简单 的。

一个 makefile 主要含有一系列的规则,如下:

: ...
(tab)
(tab)
.
.
.

例如,考虑以下的 makefile :

=== makefile 开始 ===
myprog : foo.o bar.o
  gcc foo.o bar.o -o myprog

foo.o : foo.c foo.h bar.h
  gcc -c foo.c -o foo.o

bar.o : bar.c bar.h
  gcc -c bar.c -o bar.o
=== makefile 结束 ===

这是一个非常基本的 makefile —— make 从最上面开始,把上 面第一个目的,‘myprog’,做为它的主要目标(一个它需要保 证其总是最新的最终目标)。给出的规则说明只要文件‘myprog’ 比文件‘foo.o’或‘bar.o’中的任何一个旧,下一行的命令将 会被执行。

但是,在检查文件 foo.o 和 bar.o 的时间戳之前,它会往下查 找那些把 foo.o 或 bar.o 做为目标文件的规则。它找到的关于 foo.o 的规则,该文件的依靠文件是 foo.c, foo.h 和 bar.h 。 它从下面再找不到生成这些依靠文件的规则,它就开始检查磁碟 上这些依靠文件的时间戳。如果这些文件中任何一个的时间戳比 foo.o 的新,命令 'gcc -o foo.o foo.c' 将会执行,从而更新 文件 foo.o 。 

接下来对文件 bar.o 做类似的检查,依靠文件在这里是文件 bar.c 和 bar.h 。

现在, make 回到‘myprog’的规则。如果刚才两个规则中的任 何一个被执行,myprog 就需要重建(因为其中一个 .o 档就会比 ‘myprog’新),因此连接命令将被执行。

希望到此,你可以看出使用 make 工具来建立程序的好处——前 一章中所有繁琐的检查步骤都由 make 替你做了:检查时间戳。 你的源码文件里一个简单改变都会造成那个文件被重新编译(因 为 .o 文件依靠 .c 文件),进而可执行文件被重新连接(因为 .o 文件被改变了)。其实真正的得益是在当你改变一个 header 档的时候——你不再需要记住那个源码文件依靠它,因为所有的 资料都在 makefile 里。 make 会很轻松的替你重新编译所有那 些因依靠这个 header 文件而改变了的源码文件,如有需要,再 进行重新连接。

当然,你要确定你在 makefile 中所写的规则是正确无误的,只 列出那些在源码文件中被 #include 的 header 档……

2.2 编写 make 规则 (Rules)

最明显的(也是最简单的)编写规则的方法是一个一个的查 看源码文件,把它们的目标文件做为目的,而C源码文件和被它 #include 的 header 档做为依靠文件。但是你也要把其它被这些 header 档 #include 的 header 档也列为依靠文件,还有那些被 包括的文件所包括的文件……然后你会发现要对越来越多的文件 进行管理,然后你的头发开始脱落,你的脾气开始变坏,你的脸 色变成菜色,你走在路上开始跟电线杆子碰撞,终于你捣毁你的 电脑显示器,停止编程。到低有没有些容易点儿的方法呢?

当然有!向编译器要!在编译每一个源码文件的时候,它实在应 该知道应该包括什么样的 header 档。使用 gcc 的时候,用 -M 开关,它会为每一个你给它的C文件输出一个规则,把目标文件 做为目的,而这个C文件和所有应该被 #include 的 header 文 件将做为依靠文件。注意这个规则会加入所有 header 文件,包 括被角括号(`

    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 文档数据库mongodb与列式数据库hbase详细比较
  • XML文档比较工具 ExamXML
  • unix下有没有比较好的程序版本控制和文档管理的工具?
  • 谁有比较完整的开发文档,包括需求分析,结构设计等,主要是参考一下格式
  • 请问哪里有比较全的Linux内核编程API和数据结构的文档?
  • 我这种情况,用什么文档管理软件比较好
  • 怎样用JAXP高效的比较两个XML文档是否内容相同?急!!有价值必给分!!!
  • 哪里有比较系统的介绍 linux 开发的文档阿 ?
  • 请推荐比较好的linux学习站点和文档下载站点
  • C++ Maps 成员 key_comp():返回比较元素key的函数
  • 你们看是不是可以这样理解:在用来进行两个对象的比较时,==操作符用来比较两个对象的引用地址,而equals()用来比较两个对象的值。
  • C++ Maps 成员 value_comp():返回比较元素value的函数
  • 问一下,现在比较新比较好的MYSQL版本和JDBC版本
  • C++ MultiMaps 成员 key_comp():返回比较key的函数
  • SOCKET 比较是在比较什么 急
  • C++ MultiMaps 成员 value_comp():返回比较元素value的函数
  • 问一个比较简单的问题 frame 的 setSize()放在那里比较合适
  • C++ Double Ended Queues(双向队列) 成员 Operators:比较和赋值双向队列
  • 大家推荐一下有关LINUX7有关的网络编程的书。最好是比较全面的!比较经典的。
  • C++ Stacks(堆栈) 成员 操作:比较和分配堆栈
  • 用java读一个比较大的文本文件(几百k~几M)怎么才能比较快?
  • C++ Strings(字符串) 成员 Operators:操作符,用于字符串比较和赋值
  • "400分给有比较好的字符串比较的算法的朋友"要结帖,想做笔迹保留的不可漏看哦
  • C++ Strings(字符串) 成员 compare():比较两个字符串
  • arm-linux-gcc 在哪下载比较好,历史版本比较齐?
  • linux c/c++ IP字符串转换成可比较大小的数字
  • 问一个比较简单的问题 请不要见笑 frame 的 setVisible()放在那里比较合适?
  • C++ Bitsets 成员 Operators:比较和赋值bitsets
  • 在JSP中用session比较好?还是cookie比较好?因为什么?
  • STL vector+sort排序和multiset/multimap排序比较
  • 请大家帮忙推荐几款linux下比较好用的看jpeg图和看mpeg4比较好用的软件!


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3