使用makefile
最近在学习一个处理二维相场问题的c++程序,遇到了makefile文件,之前没有接触过,这里做一个简单的整理。
什么是makefile?
大多程序员使用的windows操作系统,IED都完成了makefile的工作,所以对于makefile了解不多,而linux下使用的全是命令行,要完成一个工程化项目,就不得不使用到makefile了。
我们知道一个程序中包括各种不同的源文件,根据不同用途,放在不同的目录下,而makefile文件就可以决定哪个文件先编译、哪个文件后编译、哪个文件重新编译,这样,我们就可以通过makefile按照顺序执行。 一般来说,大多数IDE都有这个命令,比如Delphi的make,Visual C++的nmake,Linux下GUN的make。
简单的说: makefile是告诉系统如何编译和链接程序。
为什么需要makefile?
因为通过makefile我们可以方便地执行一个工程型文件,即使项目工程化,即通过makefile自动编译工程文件,而不需要我们在命令行中一个一个命令的敲。对于C++程序,和JavaScript是不同的,因为JavaScript是解释型语言,而C++是编译型语言,所以,需要先编译成可执行文件,接着才可执行。那么,具体的编译过程是怎样的呢?
程序的编译和链接是怎样的?
一般来说c和c++语言过程如下:
首先都是要先把源文件编译成中间代码文件,在windows下表现为.obj文件,unix下是.o文件,即object file,这个动作叫做编译(compile);
然后再把所有的object file合成可执行文件,这个动作叫做链接(link)。
编译须知:在编译c、c++程序时,编译器需要的是(1)语法正确变量和(2)函数声明的正确。 对于后者,通常是你要告诉编译器头文件的位置,显然,头文件都是声明而已,而其中的定义是在c、c++文件中的,这时只要所有的语法正确,编译器就可以编译出中间目标文件(object file)了。一般来说,每一个源文件都会对应于一个中间文件。
链接须知:链接时,主要是链接函数和全局变量。所以,我们可以使用中间目标文件来链接我们的程序。在连接的过程中,我们并不管函数所在的源文件,只管函数的目标文件,在大多数时候,由于中间目标文件太多,所以会比较繁琐,这时一般就会将多个中间目标文件打包在一起, 在windows下即为库文件(library file),也就是.lib文件;在unix下,是archive文件,即.a文件。
于是,我们可以总结一下,源文件首先会生成中间目标文件,再由中间目标文件生成执行文件。在编译时,编译器只检测程序语法,和函数、变量是否被声明。如果函数未被声明,编译器会给出一个警告,但可以生成Object File。而在链接程序时,链接器会在所有的Object File中找寻函数的实现,如果找不到,那到就会报链接错误码(Linker Error),不能生成最终的文件,在VC下,这种错误一般是:Link 2001错误,意思说是说,链接器未能找到函数的实现。你需要指定函数的Object File。
makefile的规则是怎样的?
<target> : <prerequisites>
[tab] <commands>
如上所示,这就是makefile最基本的规则了。
target即为目标,可以是一个目标文件(object file), 也可以是一个标签(label)。
prerequisites是前置条件,是要生成target所需要的文件或目标,所以称之为前置条件。
tab说明这里需要一个空格。
commands即为需要执行的命令。
ok! 这就是makefile的基本规则了,即生成target需要一个或多个prerequisites的情况下执行commands命令。
makefile实例讲解
a.txt: b.txt c.txt
cat b.txt c.txt > a.txt
这个例子就是说: 希望生成a.txt需要b.txt和c.txt为前置条件。 那么怎么生成呢,就是将b.txt和c.txt合并起来,即cat命令。
更多阅读 && 参考文章
使用makefile的更多相关文章
- 说说Makefile那些事儿
说说Makefile那些事儿 |扬说|透过现象看本质 工作至今,一直对Makefile半知半解.突然某天幡然醒悟,觉得此举极为不妥,只得洗心革面从头学来,以前许多不明觉厉之处顿时茅塞顿开,想想好记性不 ...
- 编写一个通用的Makefile文件
1.1在这之前,我们需要了解程序的编译过程 a.预处理:检查语法错误,展开宏,包含头文件等 b.编译:*.c-->*.S c.汇编:*.S-->*.o d.链接:.o +库文件=*.exe ...
- 编写简单的Makefile文件
makefile中的编写内容如下: www:hello.c x.h gcc hello.c -o hello clean: rm hello www:hello.c x.h 表示生成www这个文件需 ...
- 简单编写Makefile
相信很多朋友都有过这样的经历,看着开源项目中好几页的makefile文件,不知所云.在日常学习和工作中,也有意无意的去回避makefile,能改就不写,能用ide就用ide.其实makefile并没有 ...
- [转]Linux中configure/makefile
本文教你如何使用autoconf.automake等来制作一个以源代码形式(.tar.gz)发布的软件.并可在执行configure时使用自定义参数. 一.概述和基础知识 在Linux下得到一个以源代 ...
- Linux内核配置、编译及Makefile简述
Hi,大家好!我是CrazyCatJack.最近在学习Linux内核的配置.编译及Makefile文件.今天总结一下学习成果,分享给大家^_^ 1.解压缩打补丁 首先是解压缩你获取到的Linux内核. ...
- make 查找的文件名顺序为:“GNUmakefile”、“makefile”、“Makefile”
默认的情况下,make会在工作目录(执行make的目录)下按照文件名顺序寻找makefile文件读取并执行,查找的文件名顺序为:“GNUmakefile”.“makefile”.“Makefile”. ...
- 实例:对2个Makefile的备注
实例1:Makefile编译链接简单.c函数 example.c Makefile exe: example.c gcc example.c -o exe clean: rm exe 执行效果: 实例 ...
- Linux中C程序调试、makefile
gcc基本语法格式:gcc [-选项] 源文件 [-选项] 目标文件,GCC编译C程序的过程: 预处理:gcc -E hello.c hello.i.-E指定执行到预处理结束,下面类似. 编译:gcc ...
- Linux工具入门:make工具与Makefile文件
1. make工具 利用make工具可以自动完成编译工作,这些工作包括: 如果修改了某几个源文件,则只重新编译这几个源文件 如果某个头文件被修改了,则重新编译所有包含该头文件的源文件 利用这种自动编译 ...
随机推荐
- P1(2)线性回归
线性回归问题,是监督学习,输出是连续值.(批梯度下降训练参数+平方误差函数做代价函数)
- 第18章:MongoDB-聚合操作--聚合管道--$sort
①$sort 使用“$sort”可以实现排序,设置1表示升序,设置-1表示降序. ②范例:实现排序
- 【ORA错误大全】 ORA-19527
在做主备切换的时候,需要将备库的联机日志文件清除(clear online redo logfile),为了加快switchover的速度,Oracle10g在将备库置于manged standby状 ...
- kepware http接口 GO语言开发
读取某变量的值 package main import ( "fmt" "net/http" "io/ioutil" ) func main ...
- eclipse中ctrl+K失效
从昨天开始eclipse中Ctrl+d和Ctrl+K就失效了,简直无法忍受 解决方案: Window --> preferences --> General --> keys
- zoj2607
题意:如左图,给定A,B,C,D的面积分别为大于等于a,b,c,d,求最小的面积 思路:因为a,b肯定有一个是满的(不然还可压缩到更小),同理,ac,bd,cd都只有一个是满的,所以有可能是对角满的, ...
- POJ 2007 Scrambled Polygon 凸包点排序逆时针输出
题意:如题 用Graham,直接就能得到逆时针的凸包,找到原点输出就行了,赤果果的水题- 代码: /* * Author: illuz <iilluzen[at]gmail.com> * ...
- shell 中的 && 和 ||
shell 中的 && 和 || 简言之,shell 中 && --左边的命令执行成功才会执行右边的命令. || -- 左边的命令执行失败才会执行右边的命令.
- eclipse 离线安装插件报cannot perform operation.Computing alternate solutions...解决办法
当不能连接外网,离线安装SVN插件时,可能会发现以下问题:eclipse长时间停留在下图所示状态,提示“cannot perform operation.Computing alternate sol ...
- [Proposal]Transform ur shapes!
[Name] Transform ur shapes [Motivation]市场上有很多涂鸦游戏,例如火柴人涂鸦,非常有趣 我们可以结合所学,将一些图形变形的操作融入进去,做一个我们自己的有趣的游戏 ...