跟我一起写Makefile:概述
什么是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:概述的更多相关文章
- 怎么写makefile?(转)
跟我一起写 Makefile 陈皓 第一章.概述 什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都为你做了这个工作,但我觉得要作一个好的和 pr ...
- 跟我一起写 Makefile
转自 陈皓 的博客:http://blog.csdn.net/haoel/article/details/2886 1. 概述 2. 关于程序的编译和链接 3. Makefile 介绍 4. Make ...
- 【转载】Linux下makefile详解--跟我一起写 Makefile
概述 —— 什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都为你做了这个工作,但我觉得要作一个好的和professional的程序员,makef ...
- 【转】[精华] 跟我一起写 Makefile
陈皓 概述 —— 什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都为你做了这个工作,但我觉得要作一个好的和professional的程序员,m ...
- (转)跟我一起写MAKEFILE
概述 —— 什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都为你做了这个工作,但我觉得要作一个好的和professional的程序员,makef ...
- 跟我一起写 Makefile(一)
跟我一起写 Makefile 陈皓 概述—— 什么是makefile?也许非常多Winodws的程序猿都不知道这个东西,由于那些Windows的IDE都为你做了这个工作,但我认为要作一个好的和pro ...
- 怎样写Makefile文件(C语言部分)
本文摘抄自"跟我一起写Makefile ",只是原文中我自己感觉比较精要的一部分,并且只针对C语言,使用GCC编译器. 原文请看这里:http://wiki.ubuntu.org. ...
- 跟我一起写 Makefile(一)【转】
转自:http://blog.csdn.net/haoel/article/details/2886 跟我一起写 Makefile 陈皓 概述—— 什么是makefile?或许很多Winodws的程序 ...
- 跟我一起写 Makefile(一)[转]
原文链接 http://bbs.chinaunix.net/thread-408225-1-1.html(出处: http://bbs.chinaunix.net/) 陈皓 概述—— 什么是makef ...
随机推荐
- AVR单片机8位数码管显示的程序实现
AVR单片机8位数码管显示的程序实现 转载:http://www.sohu.com/a/117255149_119709 2016-10-26 16:30 我们接着来完成 数码管的显示实验.现在我 ...
- 常用css属性总结
边框修饰:border------>top,bottom,left,right上下左右边框 分为:color,类型style{ groove,dashed,ridge,solid}一个值---- ...
- python学习笔记(6)——字典(Dictionary)
dict= {key1 : value1, key2 : value2 ...} 关键词:字典中元素成对出现- key:value 格式- 两端{ } ,键:值,每对键值间用 ,隔开. 键key-唯一 ...
- Java软件开发中迭代的含义
软件开发中,各个开发阶段不是顺序执行的,而各个阶段都进行迭代并行执行的,然后在进入下一个阶段的开发. 这样对于开发中的需求变化,及人员变动都能得到更好的适应. 软件开发过程汇总迭代模型如下图所示:
- (转)淘淘商城系列——Solr的安装
http://blog.csdn.net/yerenyuan_pku/article/details/72874134 Solr是一个独立的企业级搜索应用服务器,它对外提供类似于Web-service ...
- SQL关于触发器及存储过程的创建
使用T-SQL语句来创建触发器 基本语句如下﹕ create trigger trigger_name on {table_name | view_name} {for | After | Ins ...
- JS的filter用法
filter也是一个常用的操作,它用于把Array的某些元素过滤掉,然后返回剩下的元素. 和map()类似,Array的filter()也接收一个函数.和map()不同的是,filter()把传入的函 ...
- 关于mybatis返回值resultType为空的问题
假设数据库中一个user表 此时只有id为1的数据,当我们查询id为2的年龄时的时候返回值为null 但是在mybatis中预定义UserMapper.xml中 <select id=" ...
- 当点阵字库遇到3D
早在遥远的DOS时代,点阵汉字库为计算机处理汉字起到了关键作用.当时的显示器在图形模式下的分辨率只有640x480甚至320x200,显示汉字直接使用点阵字库在屏幕上打点就可以了.如今的电脑屏幕甚至手 ...
- LINUX-挂载一个文件系统
mount /dev/hda2 /mnt/hda2 挂载一个叫做hda2的盘 - 确定目录 '/ mnt/hda2' 已经存在 umount /dev/hda2 卸载一个叫做hda2的盘 - 先从挂载 ...