什么是makefile?也许非常多Winodws的程序猿都不知道这个东西。由于那些Windows的集成开发环境(integrateddevelopment
environment,IDE)都为你做了这个工作,但我认为要作一个好的和professional的程序猿,makefile还是要懂。这就好像如今有这么多的HTML的编辑器。但假设你想成为一个专业人士,你还是要了解HTML的标识的含义。

特别在Unix下的软件编译,你就不能不自己写makefile了,会不会写makefile,从一个側面说明了一个人是否具备完毕大型project的能力。

由于,makefile关系到了整个project的编译规则。

一个project中的源文件不计其数。而且按类型、功能、模块分别放在若干个文件夹中。makefile定义了一系列的规则来指定。哪些文件须要先编译。哪些文件须要后编译,哪些文件须要又一次编译,甚至于进行更复杂的功能操作,由于makefile就像一个Shell脚本一样。当中也能够运行操作系统的命令。

makefile带来的优点就是——“自己主动化编译”,一旦写好。仅仅须要一个make命令,整个project全然自己主动编译,极大的提高了软件开发的效率。make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说。大多数的IDE都有这个命令,比方:Delphi的make,VisualC++的nmake。Linux下GNU的make。可见。makefile都成为了一种在project方面的编译方法。

如今讲述怎样写makefile的文章比較少。这是我想写这篇文章的原因。当然。不同厂商的make各不同样,也有不同的语法,但其本质都是在“文件依赖性”上做文章,这里,我仅对GNU的make进行讲述,我的环境是RedHatLinux
8.0,make的版本号是3.80。畢竟,这个make是应用最为广泛的,也是用得最多的。并且其还是最遵循于IEEE1003.2-1992标准的(POSIX.2)。

在这篇文档中,将以C/C++的源代码作为我们基础,所以必定涉及一些关于C/C++的编译的知识。相关于这方面的内容,还请各位查看相关的编译器的文档。这里所默认的编译器是UNIX下的GCC和CC。

关于程序的编译和链接

在此,我想多说关于程序编译的一些规范和方法。一般来说,不管是C、C++、还是pas。首先要把源文件编译成中间代码文件,在Windows下也就是.obj文件。UNIX下是.o文件。即ObjectFile,这个动作叫做编译(compile)。然后再把大量的ObjectFile合成运行文件,这个动作叫作链接(link)。

编译时,编译器须要的是语法的正确,函数与变量的声明的正确。对于后者,一般是你须要告诉编译器头文件的所在位置(头文件里应该仅仅是声明,而定义应该放在C/C++文件里)。仅仅要全部的语法正确,编译器就能够编译出中间目标文件。一般来说,每一个源文件都应该相应于一个中间目标文件(O文件或是OBJ文件)。

链接时。主要是链接函数和全局变量,所以,我们能够使用这些中间目标文件(O文件或是OBJ文件)来链接我们的应用程序。链接器并无论函数所在的源文件。仅仅管函数的中间目标文件(ObjectFile)。在大多数时候,因为源文件太多,编译生成的中间目标文件太多。而在链接时须要明显地指出中间目标文件名称,这对于编译非常不方便。所以,我们要给中间目标文件打个包,在Windows下这样的包叫“库文件”(LibraryFile)。也就是.lib文件,在UNIX下。是ArchiveFile。也就是.a文件。

总结一下,源文件首先会生成中间目标文件,再由中间目标文件生成运行文件。在编译时。编译器仅仅检測程序语法。和函数、变量是否被声明。假设函数未被声明。编译器会给出一个警告,但能够生成ObjectFile。

而在链接程序时。链接器会在全部的ObjectFile中找寻函数的实现,假设找不到,那到就会报链接错误码(LinkerError)。在VC下,这样的错误通常是:Link2001错误,意思说是说,链接器未能找到函数的实现。

你须要指定函数的ObjectFile.

好,言归正传。gnu的make有很多的内容,闲言少叙。

from Ubuntu wiki

跟我一起写Makefile:概述的更多相关文章

  1. 怎么写makefile?(转)

    跟我一起写 Makefile 陈皓 第一章.概述 什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都为你做了这个工作,但我觉得要作一个好的和 pr ...

  2. 跟我一起写 Makefile

    转自 陈皓 的博客:http://blog.csdn.net/haoel/article/details/2886 1. 概述 2. 关于程序的编译和链接 3. Makefile 介绍 4. Make ...

  3. 【转载】Linux下makefile详解--跟我一起写 Makefile

    概述 —— 什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都为你做了这个工作,但我觉得要作一个好的和professional的程序员,makef ...

  4. 【转】[精华] 跟我一起写 Makefile

    陈皓 概述  —— 什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都为你做了这个工作,但我觉得要作一个好的和professional的程序员,m ...

  5. (转)跟我一起写MAKEFILE

    概述 —— 什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都为你做了这个工作,但我觉得要作一个好的和professional的程序员,makef ...

  6. 跟我一起写 Makefile(一)

    跟我一起写 Makefile  陈皓 概述—— 什么是makefile?也许非常多Winodws的程序猿都不知道这个东西,由于那些Windows的IDE都为你做了这个工作,但我认为要作一个好的和pro ...

  7. 怎样写Makefile文件(C语言部分)

    本文摘抄自"跟我一起写Makefile ",只是原文中我自己感觉比较精要的一部分,并且只针对C语言,使用GCC编译器. 原文请看这里:http://wiki.ubuntu.org. ...

  8. 跟我一起写 Makefile(一)【转】

    转自:http://blog.csdn.net/haoel/article/details/2886 跟我一起写 Makefile 陈皓 概述—— 什么是makefile?或许很多Winodws的程序 ...

  9. 跟我一起写 Makefile(一)[转]

    原文链接 http://bbs.chinaunix.net/thread-408225-1-1.html(出处: http://bbs.chinaunix.net/) 陈皓 概述—— 什么是makef ...

随机推荐

  1. 最容易理解的HMM文章

    wiki上一个比较好的HMM例子 分类 隐马尔科夫模型 HMM(隐马尔科夫模型)是自然语言处理中的一个基本模型,用途比较广泛,如汉语分词.词性标注及语音识别等,在NLP中占有很重要的地位.网上关于HM ...

  2. oracle查询性能优化

    原文http://www.cnblogs.com/cnjava/archive/2013/02/28/2937699.html 讲解的oracle数据库面对大数据如何优化查询.

  3. Shell输入/输出重定向

    输出重定向 重定向一般通过在命令间插入特定的符号来实现.特别的,这些符号的语法如下所示 command1 >file1 上面这个命令执行command1然后将输出的内容存入file1. 注意任何 ...

  4. CAD梦想看图6.0安卓版 20181022更新

    下载地址: http://www.mxdraw.com/ndetail_10109.html 1. 保存上次的文件浏览位置和绘制颜色 2. 调整工具条按钮位置和文字 3. 增加测量距离和面积时的捕捉功 ...

  5. 全局唯一的支付和订单id生成算法

    数据库存储的是两个Long类型的复合主键.显示到页面的是一个27位的数字单号 package com.yunyihenkey.common.idworker; /** * * @desc * @aut ...

  6. 【6.24校内test】T1 江城唱晚

    [题目背景] 墙角那株海棠,是你种下的思念. 生死不能忘,高烛照容颜. 一曲江城唱晚,重忆当年坐灯前, 青衫中绣着你留下的线. ——银临<江城唱晚> [问题描述] 扶苏是个喜欢一边听古风歌 ...

  7. JPA @MappedSuperclass注解

    该注解只能引用于类上,使用该注解的类将不是一个完整的类,不会映射到数据库的表中,但是该类的属性会映射到其子类的数据库字段中 @MappedSuperclass注解使用在父类上面,是用来标识父类的作用 ...

  8. (C/C++学习)19.单目标遗传算法的C程序实现

    说明:在学习生活中,经常会遇到各种各样的最优问题,其中最常见的就是求某个多维(多个自变量)函数在各个自变量各取何值时的最大值或最小值:例如求函数 f(x) = (x-5)2+(y-6)2+(z-7)2 ...

  9. VNC 安装 (适用Redhat 9.0 和 CentOS 7.0+)

    Remote Service 本文转自https://www.cnblogs.com/yjscloud/p/6695388.html VNC 安装 (适用Redhat 9.0 和 CentOS 7.0 ...

  10. average column data from multiple files

    example in file a, data is [1 , 2, 3; 4,5,6] file b, data is  [4,5, 6; 7,8,9] average=0.5 (a+b) matl ...