跟我一起写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 ...
随机推荐
- 在Redux中使用插件createAction之后
我们知道在React的Redux的中的action在项目开发过程中,一般时使用createAction来生成 举个栗子,小李子: const createTodo=createACtion('CREA ...
- Android开发: 关于性能需要考虑的
刚做Android开发时,只管完成任务,将需求完成,以能完成一款界面酷炫的app为自豪.然而,随着代码量的增加,越来越意识到,一款成功的移动端产品,光有酷炫的外衣还不够,还需要在各方面都优秀. 试想, ...
- strong,weak, retain, assign的区别@property的参数
strong,weak, retain, assign的区别@property的参数 先说经验 使用场合 copy:NSString,block, weak:UI控件,代理 strong:一般对象.自 ...
- redis的安装、启动、主从配置,以及.Net下StackExchange.Redis的使用
开门见山,Linux下配个环境真是苦逼死了,这里记录一下,囧 一.环境 服务端:Ubuntu16.04 LTS(虚拟机,redis官方没有window发布版本,而且在Linux下运行更稳定) 客户端: ...
- CentOS上oracle 11g R2数据库安装折腾记
1.虚拟机上centos镜像的获取.这里推荐网易镜像站中的CentOS7版本(其他开源镜像站亦可).这里给出链接: http://mirrors.163.com/centos/7.3.1611/iso ...
- Flask框架 之重定向、cookie和session
一.URL重定向(redirect) @app.route("/login") def login(): # 使用url_for函数通过视图函数的名字找到url路径 url = u ...
- BZOJ 1058: [ZJOI2007]报表统计 multiset + 卡常
Code: #include<bits/stdc++.h> #define maxn 600000 #define inf 1000000000 using namespace std; ...
- scala学习(1)----map和flatMap的区别
转载:https://www.cnblogs.com/wbh1000/p/9846401.html 两者的区别主要在于action后得到的值 例子: import org.apache.spark.{ ...
- 学习SpringBoot中遇见的坑
1. 在搭建SpringBoot HelloWorld 时项目结构应该这样: 而不能这样: 否则访问时出现错误页面: 原因:此时还不知道,先记录下来. --已解决2018/12/11,因为Spring ...
- linux性能优化cpu-02平均负载
每次我们系统变慢时,我们通常做的第一件事就是top命令或者uptime命令,看一下系统的负载情况,比如下面: 我在命令行中输入uptime 22:15:51 表示当前系统时间 up 13 min ...