GNU的make命令、makefile编写
makefile简介
makefile可实现工程的自动化编译,只需一个make命令即可一键完成。makefile定义了一些规则,指定哪些文件需要先编译、后编译、重新编译等。
一般的C或者C++程序,都需要先编译成中间文件,windows下为.obj文件,UNIX下为.o文件,这个过程称为编译(compile)。
每个原文件都应该对应一个中间文件(.obj文件或者.o文件),把大量的中间文件合成执行文件的过程,称为链接(Link);链接时,主要是链接函数和变量,即可以使用.obj文件或者.o文件链接应用程序。链接器只关系函数的中间文件,不关心源文件的位置,为了避免大量的中间文件的复杂管理,需给中间文件打包,windows下称为库文件(Library File),即.lib文件,UNIX下为Archive File,即 .a文件。
makefile规则
流程
目标 : 需要的条件(注意 : 两边的空格)
命令(以Tab键开头)
解释一下:
目标可以是一个或者多个,可以是ObjectFile文件、执行文件、甚至标签条件指的是 依赖的文件或者目标命令指的是 生成目标需要执行的脚本
总结:即一条makefile规则定义了编译的依赖关系,目标文件依赖于条件,生成规则用命令
举个例子
objects = main.o kbd.o command.o display.o /
insert.o search.o files.o utils.o
edit : $(objects)
cc -o edit $(objects)
main.o : main.c defs.h
cc -c main.c
kbd.o : kbd.c defs.h command.h
cc -c kbd.c
command.o : command.c defs.h command.h
cc -c command.c
display.o : display.c defs.h buffer.h
cc -c display.c
insert.o : insert.c defs.h buffer.h
cc -c insert.c
search.o : search.c defs.h buffer.h
cc -c search.c
files.o : files.c defs.h buffer.h command.h
cc -c files.c
utils.o : utils.c defs.h
cc -c utils.c
clean :
rm edit $(objects)
make命令
- 首先在当前目录下寻找"makefile"或者"Makefile"文件找到,则定位到第一个目标文件(target),上例中,会找到"edit"文件,并把此文件作为最终目标文件
- 若eidt文件不存在,或者eidt后依赖的.o文件的修改时间比edit文件新,则执行后面定义的命令生成edit文件
- 若edit后依赖的.o文件也不存在,make会在当前文件中寻找.o文件的依赖性,若找到,则根据那个规则生成.o文件.c和.h文件存在,make生成.o文件,最后执行edit
自动推导
GNU的make命令支持自动推导,只要make看到一个.o文件,就会自动把.c文件加到依赖关系中,则上述例子可简化为以下形式
objects = main.o kbd.o command.o display.o /
insert.o search.o files.o utils.o
edit : $(objects)
cc -o edit $(objects)
main.o : defs.h
kbd.o : defs.h command.h
command.o : defs.h command.h
display.o : defs.h buffer.h
insert.o : defs.h buffer.h
search.o : defs.h buffer.h
files.o : defs.h buffer.h command.h
utils.o : defs.h
clean :
rm edit $(objects)
文件功能
make支持多文件共简规则,上述例子可进一步简化为如下形式(但不推荐,因为较难维护)
objects = main.o kbd.o command.o display.o /
insert.o search.o files.o utils.o
edit : $(objects)
cc -o edit $(objects)
$(objects) : defs.h
kbd.o command.o files.o : command.h
display.o insert.o search.o files.o : buffer.h
clean :
rm edit $(objects)
清空目标文件规则
每一个makefile文件都应该清楚的写一个清空目标的(.o和执行文件)规则,有利于重编译和文件的清结性。
.PHONY表示clean是一个"伪目标",rm前的减号表示,某些文件出问题但是不要管,继续往下走。
clean默认放在文件尾,不然会被当作默认目标。
`一般的风格为:`
clean:
rm edit $(objects)
`较为稳健的方法:`
.PHONY : clean
clean :
-rm edit $(objects)
make编译安装
流程
首先下载
.tar.gz或者.tar.bz2软件包文件使用
tar命令解压进入到解压后文件目录(因为make是搜索当前文件位置)
使用
./configure -prefix={Your Install Path}(其他configure参数自行百度)make编译(或者使用make all,过程有时很慢,有时会报错,可能是依赖包的问题,解决依赖关系即可)
make install安装(需足够权限,部分软件需要make check 或者 make test 进行测试)make clean清除编译产生的中间文件(Objectfile或者.o文件)
举个例子
//1.解压缩
tar -zxf xxxxx-4.0.2.tar.gz
//2.进入目录
cd xxxxx-4.0.2
//3.配置
./configure --prefix=/usr/local/xxxxx
//4.编译
make all
//5.安装
make install && make install-init && make install-commandmode && make install-config
//6.清除中间文件
make clean
相关链接
- http://blog.csdn.net/haoel/article/details/2887
- http://www.cnblogs.com/xwdreamer/p/3623454.html
- http://www.linuxidc.com/Linux/2011-02/32211.htm
GNU的make命令、makefile编写的更多相关文章
- 2.linux下Makefile编写规范
转自陈皓 (CSDN) 概述—— 什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都为你做了这个工作,但我觉得要作一个好的和 profession ...
- makefile编写--引用
1. Makefile 简介 Makefile 是和 make 命令一起配合使用的. 很多大型项目的编译都是通过 Makefile 来组织的, 如果没有 Makefile, 那很多项目中各种库和代码之 ...
- makefile编写
概述 什么是makefile?或许非常多Winodws的程序猿都不知道这个东西,由于那些Windows的IDE都为你做了这个工作,但我觉得要作一个好的和professional的程序猿,makefil ...
- Makefile编写 一 *****
编译:把高级语言书写的代码转换为机器可识别的机器指令.编译高级语言后生成的指令虽然可被机器识别,但是还不能被执行.编译时,编译器检查高级语言的语法.函数与变量的声明是否正确.只有所有的语法正确.相关变 ...
- Yocto开发笔记之《Makefile编写》(QQ交流群:519230208)
开了一个交流群,欢迎爱好者和开发者一起交流,转载请注明出处. QQ群:519230208,为避免广告骚扰,申请时请注明 “开发者” 字样 =============================== ...
- Make和Makefile编写(详见GCC手册)
Makefile和Make Rules 多模块软件.依赖树和Make 默认规则 Make使用程序对简单变量的支持 内建变量 虚目标 特殊目标 一般性语法错误及其纠正措施 命令行的使用和调试 Makef ...
- linux 下C语言编程库文件处理与Makefile编写
做开发快3年了,在linux下编译安装软件算是家常便饭了.就拿gcc来说,都有不下10次了,可基本每次都会碰到些奇奇怪怪的问题.看来还是像vs.codeblocks这样的ide把人弄蠢了.便下定决心一 ...
- 单目录下多文件 makefile编写
makefile很久就接触过了,但是一直没怎么深入的去学习和总结:在项目中我也只是看看makefile或者修改部分语句,全部自己动手写的话还真没有:知识在于沉淀,这句说的非常好,所以现在把自己理解的东 ...
- Linux——makefile编写
以前对makefile的编写,限于刚开始接触,我都比较局限一些死板的格式,有时候就会显得有些繁琐.在进一步了解一些系统编译和链接的知识后,对makefile编写流程有了一些新的认识,所以来此梳理梳理, ...
随机推荐
- Java——Collection集合
##Collection集合 1.Collection集合是单列集合 2.Collection是所有单列集合最顶层的接口,定义了所有单列集合的共性方法 任意的单列集合都可以使用Collection接口 ...
- 【2019沈阳网络赛】G、Special necklace——自闭的物理题
这道题让我差点怀疑自己高考没考过物理 题意中 he measures the resistance of any two endpoints of it, the resistance values ...
- Building Applications with Force.com and VisualForce (DEV401) (二十):Visualforce Pages: Visualforce Componets (Tags)
Dev401-021:Visualforce Pages: Visualforce Componets (Tags) Module Agenda1.Tag Basics2.Tag Bindings T ...
- 开始 Keras 序列模型(Sequential model)
开始 Keras 序列模型(Sequential model) 序列模型是一个线性的层次堆栈. 你可以通过传递一系列 layer 实例给构造器来创建一个序列模型. The Sequential mod ...
- 医学图像 | 使用深度学习实现乳腺癌分类(附python演练)
乳腺癌是全球第二常见的女性癌症.2012年,它占所有新癌症病例的12%,占所有女性癌症病例的25%. 当乳腺细胞生长失控时,乳腺癌就开始了.这些细胞通常形成一个肿瘤,通常可以在x光片上直接看到或感觉到 ...
- 构建一个简单的 Google Dialogflow 聊天机器人【上】
概述 本教程将向您展示如何构建一个简单的Dialogflow聊天机器人,引导您完成Dialogflow的最重要功能.您将学习如何: 创建Dialogflow帐户和第一个Dialogflow聊天机器人, ...
- Python面向对象之异常处理
1:什么是异常 异常就是在我们的程序在运行过程中由于某种错误而引发Python抛出的错误: 异常就是程序运行时发生错误的信号(在程序出现错误时,则会产生一个异常,若程序没有处理它,则会抛出该异常,程序 ...
- js函数基础回顾
回头又跑去看了下尚硅谷的js基础视频 https://www.bilibili.com/video/av22958172/?p=51. 便做了如下笔记: 1.函数也是一个对象 2.函数可以封装一些功能 ...
- Web 环境设置
修改最大打开文件数量 ulimit -n 100000 修改创建文件的最大值 #/etc/security/limits.conf * soft nofile 262140 * hard nofile ...
- WPF使用 Gmap.NET 绘制极坐标运动轨迹
大家好,已经很久没有更新了,今天写一篇关于WPF 使用 Gmap.NET 相关的,网上很多Winform的很**,所以我给Wpf进行一些补充.虽然它已经很久没有更新了,但是也只能用这个了.没别的好选择 ...