新书推介:《语义网技术体系》
作者:瞿裕忠,胡伟,程龚
   XML论坛     W3CHINA.ORG讨论区     >>计算机科学论坛<<     SOAChina论坛     Blog     开放翻译计划     新浪微博  
 
  • 首页
  • 登录
  • 注册
  • 软件下载
  • 资料下载
  • 核心成员
  • 帮助
  •   Add to Google

    >> 本版讨论高级C/C++编程、代码重构(Refactoring)、极限编程(XP)、泛型编程等话题
    [返回] 计算机科学论坛计算机技术与应用『 C/C++编程思想 』 → 跟我一起写 Makefile 查看新帖用户列表

      发表一个新主题  发表一个新投票  回复主题  (订阅本版) 您是本帖的第 33521 个阅读者浏览上一篇主题  刷新本主题   平板显示贴子 浏览下一篇主题
     * 贴子主题: 跟我一起写 Makefile 举报  打印  推荐  IE收藏夹 
       本主题类别:     
     卷积内核 帅哥哟,离线,有人找我吗?
      
      
      威望:8
      头衔:总统
      等级:博士二年级(版主)
      文章:3942
      积分:27590
      门派:XML.ORG.CN
      注册:2004/7/21

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给卷积内核发送一个短消息 把卷积内核加入好友 查看卷积内核的个人资料 搜索卷积内核在『 C/C++编程思想 』的所有贴子 访问卷积内核的主页 引用回复这个贴子 回复这个贴子 查看卷积内核的博客楼主
    发贴心情 跟我一起写 Makefile

    什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows
    的IDE 都为你做了这个工作,但我觉得要作一个好的和professional 的程序员,
    makefile还是要懂。这就好像现在有这么多的HTML的编辑器,但如果你想成为一个专
    业人士,你还是要了解HTML的标识的含义。特别在Unix下的软件编译,你就不能不
    自己写makefile了,会不会写makefile,从一个侧面说明了一个人是否具备完成大型工
    程的能力。
    因为,makefile关系到了整个工程的编译规则。一个工程中的源文件不计数,其按类型、
    功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需
    要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能
    操作,因为makefile就像一个Shell脚本一样,其中也可以执行操作系统的命令。
    makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整
    个工程完全自动编译,极大的提高了软件开发的效率。make是一个命令工具,是一个
    解释makefile 中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:
    Delphi的make,Visual C++的nmake,Linux下GNU的make。可见,makefile都成为了
    一种在工程方面的编译方法。
    现在讲述如何写makefile的文章比较少,这是我想写这篇文章的原因。当然,不同产商
    的make各不相同,也有不同的语法,但其本质都是在“文件依赖性”上做文章,这里,
    我仅对GNU的make进行讲述,我的环境是RedHat Linux 8.0,make的版本是3.80。必
    竟,这个make 是应用最为广泛的,也是用得最多的。而且其还是最遵循于IEEE
    1003.2-1992 标准的(POSIX.2)。
    在这篇文档中,将以C/C++的源码作为我们基础,所以必然涉及一些关于C/C++的编
    译的知识,相关于这方面的内容,还请各位查看相关的编译器的文档。这里所默认的编
    译器是UNIX下的GCC和CC。
    关于程序的编译和链接
    在此,我想多说关于程序编译的一些规范和方法,一般来说,无论是C、C++、还是
    pas,首先要把源文件编译成中间代码文件,在Windows下也就是 .obj 文件,UNIX下
    是 .o 文件,即 Object File,这个动作叫做编译(compile)。然后再把大量的Object File
    合成执行文件,这个动作叫作链接(link)。
    编译时,编译器需要的是语法的正确,函数与变量的声明的正确。对于后者,通常是你
    需要告诉编译器头文件的所在位置(头文件中应该只是声明,而定义应该放在C/C++
    文件中),只要所有的语法正确,编译器就可以编译出中间目标文件。一般来说,每个
    源文件都应该对应于一个中间目标文件(O文件或是OBJ文件)。
    链接时,主要是链接函数和全局变量,所以,我们可以使用这些中间目标文件(O文
    件或是OBJ文件)来链接我们的应用程序。链接器并不管函数所在的源文件,只管函
    数的中间目标文件(Object File),在大多数时候,由于源文件太多,编译生成的中间
    目标文件太多,而在链接时需要明显地指出中间目标文件名,这对于编译很不方便,
    所以,我们要给中间目标文件打个包,在Windows 下这种包叫“库文件”(Library
    File),也就是 .lib 文件,在UNIX下,是Archive File,也就是 .a 文件。
    总结一下,源文件首先会生成中间目标文件,再由中间目标文件生成执行文件。在编译
    时,编译器只检测程序语法,和函数、变量是否被声明。如果函数未被声明,编译器会
    给出一个警告,但可以生成Object File。而在链接程序时,链接器会在所有的Object
    File中找寻函数的实现,如果找不到,那到就会报链接错误码(Linker Error),在VC
    下,这种错误一般是:Link 2001错误,意思说是说,链接器未能找到函数的实现。你
    需要指定函数的Object File.
    好,言归正传,GNU的make有许多的内容,闲言少叙,还是让我们开始吧。

       收藏   分享  
    顶(0)
      




    ----------------------------------------------
    事业是国家的,荣誉是单位的,成绩是领导的,工资是老婆的,财产是孩子的,错误是自己的。

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2009/3/9 9:48:00
     
     GoogleAdSense
      
      
      等级:大一新生
      文章:1
      积分:50
      门派:无门无派
      院校:未填写
      注册:2007-01-01
    给Google AdSense发送一个短消息 把Google AdSense加入好友 查看Google AdSense的个人资料 搜索Google AdSense在『 C/C++编程思想 』的所有贴子 访问Google AdSense的主页 引用回复这个贴子 回复这个贴子 查看Google AdSense的博客广告
    2026/3/6 15:21:40

    本主题贴数19,分页: [1] [2]

     *树形目录 (最近20个回帖) 顶端 
    主题:  跟我一起写 Makefile(3052字) - 卷积内核,2009年3月9日
        回复:  四、隐含规则链有些时候,一个目标可能被一系列的隐含规则所作用。例如,一个[.o]的文件生成,可..(8352字) - 卷积内核,2009年3月11日
        回复:  一、使用隐含规则如果要使用隐含规则生成你需要的目标,你所需要做的就是不要写出这个目标的规则。那..(7721字) - 卷积内核,2009年3月11日
        回复:  五、make的参数下面列举了所有GNU make 3.80版的参数定义。其它版本和产商的make..(4893字) - 卷积内核,2009年3月11日
        回复:  八、shell函数shell函数也不像其它的函数。顾名思义,它的参数应该就是操作系统Shell的..(6096字) - 卷积内核,2009年3月11日
        回复:  三、文件名操作函数下面我们要介绍的函数主要是处理文件名的。每个函数的参数字符串都会被当做一个或..(5864字) - 卷积内核,2009年3月11日
        回复:  使用函数————在Makefile中可以使用函数来处理变量,从而让我们的命令或是规则更为的灵活..(5411字) - 卷积内核,2009年3月11日
                                回复:  二、函数库成员的隐含规则当make搜索一个目标的隐含规则时,一个特殊的特性是,如果这个目标是"a..(4465字) - 卷积内核,2009年3月18日
                                回复:  六、老式风格的"后缀规则"后缀规则是一个比较老式的定义隐含规则的方法。后缀规则会被模式规则逐步地..(3776字) - 卷积内核,2009年3月18日
        回复:  五、override 指示符如果有变量是通常make的命令行参数设置的,那么Makefile中对..(6813字) - 卷积内核,2009年3月11日
        回复:  三、变量高级用法这里介绍两种变量的高级使用方法,第一种是变量值的替换。我们可以替换变量中的共有..(3597字) - 卷积内核,2009年3月11日
        回复:  五、定义命令包如果Makefile中出现一些相同命令序列,那么我们可以为这些相同的命令序列定义一..(5262字) - 卷积内核,2009年3月9日
        回复:  书写命令————每条规则中的命令和操作系统Shell的命令行是一致的。make会一按顺序一条一..(5957字) - 卷积内核,2009年3月9日
        回复:  八、自动生成依赖性在Makefile中,我们的依赖关系可能会需要包含一系列的头文件,比如,如果我..(3333字) - 卷积内核,2009年3月9日
        回复:  五、伪目标最早先的一个例子中,我们提到过一个“clean”的目标,这是一个“伪目标”,clea..(5095字) - 卷积内核,2009年3月9日
        回复:  书写规则————规则包含两个部分,一个是依赖关系,一个是生成目标的方法。在Makefile中..(4893字) - 卷积内核,2009年3月9日
        回复:  七、清空目标文件的规则每个Makefile中都应该写一个清空目标文件(.o和执行文件)的规则,这..(5120字) - 卷积内核,2009年3月9日
        回复:  三、make是如何工作的在默认的方式下,也就是我们只输入make命令。那么,1、make会在当..(5062字) - 卷积内核,2009年3月9日
        回复:  Makefile 介绍make命令执行时,需要一个 Makefile 文件,以告诉make命令需..(3734字) - 卷积内核,2009年3月9日

    W3C Contributing Supporter! W 3 C h i n a ( since 2003 ) 旗 下 站 点
    苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
    82.031ms