什么是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. 自学php【一】 任务:图片上传即时可见

    工作已经快2周了,头儿给派了个任务做个企业站!这几天正在紧锣密鼓的作战中!等忙完了这个活!写下自己的学习心得体会!与看到文章的您一起分享! 在这里记录每次遇到的难题,如何解决的! 今天要做的功能就是实 ...

  2. js异步请求

    目前async / await特性并没有被添加到ES2016标准中,但不代表这些特性将来不会被加入到Javascript中.在我写这篇文章时,它已经到达第三版草案,并且正迅速的发展中.这些特性已经被I ...

  3. RESTful API设计的简单例子

    代码承接简单服务器,修改 app.js const koa = require('koa'), app = new koa(), Router = require('koa-router'), rou ...

  4. JAVA基础数组

    数组: 数组是一种容器 存储同一类型的一组数据(必须是 类型相同的一组数据) 定义数组的公式:(有两种) 1.静态定义      1)数据类型[ ] 数组名 = {元素1,元素2,元素3,元素4,元素 ...

  5. UVA - 442 Matrix Chain Multiplication(栈模拟水题+专治自闭)

    题目: 给出一串表示矩阵相乘的字符串,问这字符串中的矩阵相乘中所有元素相乘的次数. 思路: 遍历字符串遇到字母将其表示的矩阵压入栈中,遇到‘)’就将栈中的两个矩阵弹出来,然后计算这两个矩阵的元素相乘的 ...

  6. Mybatis中collection和association的使用区别

    1. 关联-association2. 集合-collection 比如同时有User.java和Card.java两个类 User.java如下: public class User{ privat ...

  7. 使用 MyBatis 对表执行 CRUD 操作

    说明: 1.CRUD: C --  create    R -- read   U -- update  D -- delete 2.Mybatis 的 SQL 核心配置文件中 SQL 语句的参数的传 ...

  8. 手机端--tap PC端--click

    区别: tap为jq mobile 的方法 1.click与tap都会触发点击事件,但是在手机web端,click会有200-300ms的延迟,所以一般用tap代替click作为点击事件.single ...

  9. 以gnome-terminal为例,修改gnome3 的默认配置

    gnome连续几个版本的terminal默认配置文件都是同一个配置文件“b1dcc9dd-5262-4d8d-a863-c897e6d979b9”.这是因为gnome的developers编辑了这个配 ...

  10. python3.x Day3 文件编码

    文件编码: 知识点不多,但及其重要,python2和python3处理机制还有不同点,需要注意. 首先: 编码.数据类型,完全不同的概念. 文件编码:可以遵循开发环境.可以自行设定. 变量值编码:py ...