使用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工具可以自动完成编译工作,这些工作包括: 如果修改了某几个源文件,则只重新编译这几个源文件 如果某个头文件被修改了,则重新编译所有包含该头文件的源文件 利用这种自动编译 ...
随机推荐
- 【终极答案】搭建selenium3.11 +Firefox+python3.6自动化UI测试环境踩的坑
1 运行之后,出现如下报错 Selenium.common.exceptions.WebDriverException: Message: 'geckodriver' executable needs ...
- java经典40+分析
现在是3月份,也是每年开年企业公司招聘的高峰期,同时有许多的朋友也出来找工作.现在的招聘他们有时会给你出一套面试题或者智力测试题,也有的直接让你上机操作,写一段程序.算法的计算不乏出现,基于这个原 ...
- php7注意事项
1. 不要使用 mysql_ 函数 这一天终于来了,从此你不仅仅“不应该”使用mysql_函数.PHP 7 已经把它们从核心中全部移除了,也就是说你需要迁移到好得多的mysqli_函数,或者更灵活的 ...
- Andorid第一次作业
一.作业截图 二.项目路径 https://git.coding.net/bestimbalance/Android.git 三.小组成员 邢路: https://www.cnblogs.com/x ...
- Jersey RESTful WebService框架学习(一)
介绍:RESTful (Representation State Transfer) 描述了一个架构样式的网络系统,比如 web 应用程序.它首次出现在 2000 年 Roy Fielding 的博士 ...
- python_day1_python第一个程序 hello world
Python 第一个程序 1)安装好python后,cmd进入DOS下,直接输入python Python 3.6.0 (v3.6.0:41df79263a11, Dec 23 2016, 08:06 ...
- XCode中常用错误解决
No such file or directory 解决方法(可以依次尝试,总有一种能最终解决问题): 方法1.退出Xcode,然后从finder里面进入~/Library/ ...
- CentOS 网络设置修改 2
一.CentOS 修改IP地址 修改对应网卡的IP地址的配置文件# vi /etc/sysconfig/network-scripts/ifcfg-eth0 修改以下内容 DEVICE=eth0 #描 ...
- 20155326 《Java程序设计》第8周学习总结
20155326 <Java程序设计>第8周学习总结 教材学习内容总结 NIO (1)NIO使用频道来衔接数据节点,在处理数据时,NIO可以让你设定缓冲区容量,在缓冲区中对感兴趣的数据区块 ...
- MapReduce编程解析
MapReduce编程模型之案例 wordcount 输入数据 atguigu atguiguss sscls clsjiaobanzhangxuehadoop 输出数据 atguigu 2banzh ...