使用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.txtcat 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工具可以自动完成编译工作,这些工作包括: 如果修改了某几个源文件,则只重新编译这几个源文件 如果某个头文件被修改了,则重新编译所有包含该头文件的源文件 利用这种自动编译 ...
随机推荐
- Go语言高级特性总结——Struct、Map与JSON之间的转化
Struct与Map之间互相转换 // Struct2Map convert struct to map func Struct2Map(st interface{}) map[string]inte ...
- 第08章:MongoDB-CRUD操作--文档--删除
①语法 remove() [2.6以后方法过时] deleteOne() [2.6以后官方推荐] deleteMany() [2.6以后官方推荐] db.collection.remove( < ...
- cyclone IV中DDR的一个疑惑
的生成的DDR2 IP中DDR的时钟竟然是双向的,而在arria10中生成的DDR4则是输出,而DDR2的datasheet上也指出ck和ck#是输入,不知为什么? inout mem_clk , i ...
- MyBatis(二)最简易的增、删、改、查
这篇是承接上一篇的helloWorld程序.首先将一系列初始化的步骤再做一个工厂类进行包装,代码如下: package com.tinaluo.sun; import java.io.InputStr ...
- HP 集群软件 - 不能接收节点的设备查询信息:软件引起的连接失败
问题 # cmcheckconf -v -C /etc/cmcluster/cmclconfig.ascii Begin cluster verification... Checking clust ...
- kepware http接口 shell开发
读取某变量的值(wget wget --quiet \ --method GET \ --header 'Connection: keep-alive' \ --header 'Cache-Contr ...
- nodejs 负载均衡
教程:http://taobaofed.org/blog/2015/11/03/nodejs-cluster/ 纠正:net.createServerHandle(); 记录:http://www.j ...
- AlexNet详解
在imagenet上的图像分类challenge上Alex提出的alexnet网络结构模型赢得了2012届的冠军.要研究CNN类型DL网络模型在图像分类上的应用,就逃不开研究alexnet,这是CNN ...
- ASP.NET Web API 中使用 swagger 来管理 API 文档
本文以 ASP.NET Web API 为后台框架,利用 EF6 连接 postgreSQL 数据库,使用 swagger 来生成 REST APIs文档.文章分二个部分,第一部分主要讲如何用 EF6 ...
- git关联githup和码云
1.与已有的本地仓库关联git remote add origin git@github.com:michaelliao/learngit.git然后就可以协作开发push与pull 2.第二种方法直 ...