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

谁能告诉我怎样些Makefile文件

    来源: 互联网  发布时间:2015-01-31

    本文导语:  我在a.cpp中有自己些得头文件b.h,我想生成一个可以执行得文件。请问怎样写丫。 | GNU make 指南  翻译: 哈少  译者按: 本文是一篇介绍 GNU Make 的文章,读完后读者应该基本掌握了 ...

我在a.cpp中有自己些得头文件b.h,我想生成一个可以执行得文件。请问怎样写丫。

|
GNU make 指南 


翻译: 哈少 


译者按: 本文是一篇介绍 GNU Make 的文章,读完后读者应该基本掌握了 make 的用法。而 make 是所有想在 Unix (当然也包括 Linux )系统上编程的用户必须掌握的工具。如果你写的程序中没有用到 make ,则说明你写的程序只是个人的练习程序,不具有任何实用的价值。也许这么说有点 儿偏激,但 make 实在是应该用在任何稍具规模的程序中的。希望本文可以为中国的 Unix 编程初学者提供一点儿有用的资料。中国的 Linux 用户除了学会安装红帽子以外, 实在应该尝试写一些有用的程序。个人想法,大家参考。 


2) 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 文件,包 括被角括号(`

    
 
 

您可能感兴趣的文章:

  • 怎么把头文件路径告诉makefile
  • 一个makefile格式问题?知道的告诉我,谢谢
  • 一个makefile问题,知道的告诉我,谢谢
  • 请告诉一下,下载的.iso文件怎么用?见笑见笑
  • 谁能告诉我下不同操作系统对单个文件大小的限制
  • 有谁会用linux里面的wget?有一个参数是-i 后面加上url地址文件,我不明白什么叫url地址文件,那位大侠告诉我?
  • 哪位仁兄可以告诉我在linux下如何访问本机windows下的文件?
  • 如何告诉GDB我的共享库文件在哪里
  • 如何指定用javac编译生成类的存放路径。(最好不要告诉我再生成之后再把文件流重新到出这种)
  • 我想访问局域网中服务器中的一个文件,但告诉我连接被拒绝!
  • 谁能告诉我,linux下可可执行文件是什么?
  • com.borland.dbswing.* 在什么文件里啊?可以发给我一个吗?Rex_fa@163.com 告诉我也行
  • 谁能告诉我,做一个象网易那样的聊天室,用什么方法,不要告诉我是用数据库或读写文件,是不是用多线程,socket协议。来讨论者皆有分。
  • 紧急求救,请问谁的linux中有libXm.so.2这个文件,请寄给我并请告诉我路径,真诚期待,万分感激!(sailoremail@163.com)
  • 能不能告诉我使用editplus编写java如何编译成字节码文件,如何解释?,虽然问题简单一点,可对我很需要
  • 谁能告诉我,怎么调试jsp程序呀!我在jsp中调用java,但是Tomcat这家伙只会给我报jsp文件出错。这可怎么办呀?
  • 大家请把自己知道的 Unix/Linux 下的垃圾文件通配符类型告诉我,好吗?送上100分。
  • 各位高人,关于IDE的驱动程序,我看蒙了,谁能告诉我到底linux源文件中到底那些是跟IDE硬盘驱动有关的?
  • 谁能告诉我JSP中怎样使用类??先谢谢了 iis7站长之家
  • 谁告诉我可以调通这个文件??高分相送!!(关于JSP TAG的,附精彩原文)
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 谁能告诉我哪儿有 j2sdk-1_3_1-win.exe 下载,最好告诉我url
  • 我的是red hat linux9,那位好心人告诉我如何在这个系统下搭建lamp平台,按照网上装了半天,总是出错,希望有人能告诉我一个可用的方法,详细点的,谢谢
  • 谁能告诉我类和库有什么区别,送分???????
  • 那里有IBM的WEBSPHERE下载,能告诉我下载的网址吗?
  • 请告诉我websphere4的详细安装步骤
  • 推荐一本电子版的xml与java编程的书,告诉我下载地址。
  • 谁能告诉我pop3邮件操作命令列表?
  • 50分相送,告诉我gcc地址
  • 谁能告诉我JSP中怎样使用类??先谢谢了
  • 有谁能告诉我如何在Solaris下播放音乐CD呀?
  • linux进入界面需要login我不知道,谁能告诉我,谢谢
  • 各位大侠,谁告诉我怎么屏蔽?
  • 各位,能否告诉小弟那里有《thinking in java》可以下载啊!thx
  • 谁能告诉我SCJP考题的网址吗?
  • 快告诉我怎么选择所选文本好吗?
  • 有谁告诉我如何使用main中的args进行输入输出的操作?
  • 谁能告诉我回车的ascii码是多少?(10进制的)
  • 哪位大哥,大姐知道国内那个网站有jdk1.4的API下载,告诉小弟一下
  • 谁告诉我什么地方有基于java或jsp的聊天室代码下。
  • 谁能告诉我linux和unix的详细区别?


  • 站内导航:


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

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

    浙ICP备11055608号-3