- 浏览: 794208 次
- 性别:
- 来自: 大连
文章分类
- 全部博客 (417)
- ASP.NET MVC (18)
- WEB基础 (24)
- 数据库 (69)
- iPhone (20)
- JQuery (3)
- Android (21)
- UML (8)
- C# (32)
- 移动技术 (19)
- 条码/RFID (6)
- MAC (8)
- VSS/SVN (6)
- 开卷有益 (4)
- 应用软件 (1)
- 软件工程 (1)
- java/Eclipse/tomcat (61)
- 英语学习 (2)
- 综合 (16)
- SharePoint (7)
- linux (42)
- Solaris/Unix (38)
- weblogic (12)
- c/c++ (42)
- 云 (1)
- sqlite (1)
- FTp (2)
- 项目管理 (2)
- webservice (1)
- apache (4)
- javascript (3)
- Spring/Struts/Mybatis/Hibernate (4)
- 航空业务 (1)
- 测试 (6)
- BPM (1)
最新评论
-
dashengkeji:
1a64f39292ebf4b4bed41d9d6b21ee7 ...
使用POI生成Excel文件,可以自动调整excel列宽等(转) -
zi_wu_xian:
PageOffice操作excel也可以设置表格的行高列宽,并 ...
使用POI生成Excel文件,可以自动调整excel列宽等(转) -
wanggang0321:
亲,我在pptx(office2007以上版本)转pdf的时候 ...
JODConverter]word转pdf心得分享(转) -
xiejanee:
楼主:你好!我想请问下 你在代码中用DOMDocument* ...
Xerces-C++学习之——查询修改XML文档 (转)
Makefile
文件如下:
func: main.o func1.o func2.o
gcc main.o func1.o func2.o -o func
main.o: main.c mylib.h
gcc -Wall -c main.c
func1.o: func1.c mylib.h
gcc -Wall -c func1.c
func2.o: func2.c mylib.h
gcc -Wall -c func2.c
然后在这个目录下运行make编译:
$ make
gcc -Wall -c main.c
gcc -Wall -c func1.c
gcc -Wall -c func2.c
gcc main.o func1.o func2.o -o func
make命令会自动读取当前目录下的Makefile
文件,完成相应的编译步骤。
Makefile
由一组规则组成,每条规则的格式是:
target ... : prerequisites ...
command1
command2
...
例如:
func: main.o func1.o func2.o
gcc main.o func1.o func2.o -o func
func是这条规则的目标(Target), main.o func1.o和 func2.o是这条规则的条件(Prerequisite)。
目标和条件之间的关系是:欲更新目标,必须首先更新它的所有条件;所有条件中只要有一个条件被更新
了,目标也必须随之被更新。
所谓“更新”就是执行一遍规则中的命令列表,命令列表中的每条命令必须以一个Tab开头,注意不能是
空格 ,Makefile 的格式不像C语言的缩进那么随意,对于Makefile 中的每个以Tab开头的命令,make会创建
一个Shell进程去执行它。
对于上面这个例子,make执行如下步骤:
尝试更新Makefile
中第一条规则的目标func,第一条规则的目标称为缺省目标,只要缺省目标更新了就算
完成任务了,其它工作都是为这个目的而做的。由于我们是第一次编译,func文件还没生成,显然需要更
新,但规则说必须先更新了main.o、func1.o和func2.o这三个条件,然后才能更新func。
所以make会进一步查找以这三个条件为目标的规则,这些目标文件也没有生成,也需要更新,所以执行相
应的命令(gcc –Wall -c main.c、gcc –Wall -c func1.c和gcc –Wall -c func2.c)更新它们。
最后执行gcc main.o func1.o func2.o -o func更新func。
如果没有做任何改动,再次运行make:
$ make
make: `main'
is
up
to
date
.
make会提示缺省目标已经是最新的了,不需要执行任何命令更新它。
现在总结一下Makefile
的规则。如果一条规则的目标属于以下情况之一,就称为需要更新:
目标没有生成。
某个条件需要更新。
某个条件的修改时间比目标晚。
通常Makefile 都会有一个clean规则,用于清除编译过程中产生的二进制文件(.o的目标文件),保留源文
件:
clean:
@echo "cleanning project"
-rm func*.o
@echo "clean completed"
把这条规则添加到我们的Makefile
文件的末尾,然后执行这条规则:
$ make clean
cleanning project
rm func *.o
clean completed
clean目标不依赖于任何条件,并且执行它的命令列表不会生成clean这个文件。
@和-字符的效果:如果make执行的命令前面加了@字符,则不显示命令本身而只显示它的结果;通常make
执行的命令如果出错,就立刻终止,不再执行后续命令。但如果命令前面加了-号,即使这条命令出错,
make也会继续执行后续命令。通常rm命令前面要加-号,因为rm要删除的文件可能不存在,这个命令有可
能出错,但这种错误是应该忽略的。例如上面已经执行过一遍make clean,再执行一遍就没有文件可删了
,这时rm会报错,但make忽略这一错误,继续执行后面的echo命令。
如果当前目录下存在一个文件叫clean会怎么样呢?
如果存在clean这个文件,clean目标又不依赖于任何条件,make就认为它不需要更新了。而我们希望把
clean当作一个特殊的名字使用,不管它存在不存在都要更新,可以添一条特殊规则,把clean声明为一个
伪目标:
.PHONY: clean
这条规则没有命令列表。
clean:
@echo "cleanning project"
-rm func*.o
@echo "clean completed"
.PHONY: clean
本例子中的Makefile
文件如下:
func: main.o func1.o func2.o
gcc main.o func1.o func2.o -o func
main.o: main.c mylib.h
gcc -Wall -c main.c
func1.o: func1.c mylib.h
gcc -Wall -c func1.c
func2.o: func2.c mylib.h
gcc -Wall -c func2.c
clean:
@echo "cleanning project"
-rm func *.o
@echo "clean completed"
.PHONY: clean
clean目标是一个约定俗成的名字,在所有软件项目的Makefile 中都表示清除编译生成的文件,类似这样
的约定俗成的目标名字有:
all,执行主要的编译工作,通常用作缺省目标。
install,执行编译后的安装工作,把可执行文件、配置文件、文档等分别拷到不同的安装目录。
clean,删除编译生成的二进制文件。
只要符合所描述的语法的文件我们都叫它Makefile
,而它的文件名则不一定是Makefile
。事实上,执行
make命令时,是按照GNUmakefile、makefile 、Makefile 的顺序找到第一个存在的文件并执行它,不过还
是建议使用Makefile 做文件名。
发表评论
-
c++ cin输入int的用法
2014-06-10 11:17 1353int icin = 0; for(int i =0; ... -
Linux下case报错syntax error near unexpected token `in
2014-05-20 16:16 1105来分享一个在Linux下执 ... -
查看linux某目录下所有普通文件,不含目录
2014-05-14 15:15 0#include <fstream>#i ... -
scp sz
2014-03-31 18:15 0使用的是secureCRT 那么先拷贝到这台服务器上,再下 ... -
Linux可执行文件执行时找不到共享库
2014-03-31 18:09 2261编译程序时使用了如下参数指定了链接库的位置,但是执 ... -
C++ assert机制
2014-03-06 10:21 925C++ assert机制 ASSERT ... -
为什么C++语言中既有指针也有引用
2013-11-19 11:16 0写在前面的话,本文是 ... -
C++内存分配方式详解——堆、栈、自由存储区、全局/静态存储区和常量存储区
2013-11-19 10:20 806栈,就是那些由编译器 ... -
堆内存和栈内存
2013-11-19 10:13 0堆内存就是你用new 修饰符创建的内容会在堆内存中开辟一段空 ... -
C++使用CLI连接DB2
2013-11-15 09:31 3374<!--推荐博文--> ... -
使用 C++ 处理 JSON 数据交换格式
2013-09-10 11:10 909一、摘要 JSON 的全称为:JavaScript Obj ... -
C++的Json解析库:jsoncpp和boost (转)
2013-09-10 10:40 6624JSON(JavaScript Object Notatio ... -
C++ JsonCpp 使用(转)
2013-09-10 10:21 1778前言 JSON是一个轻量级 ... -
C++中map容器的说明和使用技巧(转)
2013-08-22 15:01 1031C++中map容器提供一个键值对容器,map与multim ... -
C++中各种类型的成员变量的初始化方法(转)
2013-08-01 15:26 1018c++各种不同类型成员根据是否static 、时候con ... -
Xerces浅析
2013-07-30 14:15 3140本篇文章主要讲述项目 ... -
Xerces C++ 学习笔记 (转)
2013-07-24 17:04 13191. 初始化平台: XMLPlatformUtils: ... -
Boost智能指针——shared_ptr (转)
2013-07-16 17:27 1783boost::scoped_ptr虽然简单易用,但它不能共享 ... -
GDB调试精粹及使用实例 (转)
2013-07-16 16:21 1071一:列文件清单1. List( ... -
Xerces-C++学习之——查询修改XML文档 (转)
2013-07-16 16:02 3343/** ========================== ...
相关推荐
标题“从devkitPro到WinARM的Makefile转换”涉及的是在嵌入式开发中,如何将使用devkitPro环境的Makefile转换为适应WinARM工具链的版本。这是一个常见问题,因为不同的开发环境可能有不同的编译器和链接器设置,使得...
标题"codeblocks工程转makefile"所指的就是这个转换过程,即把CodeBlocks的`.cbp`工程文件或者`.ws`工作区文件转换为`.makefile`。转换后的`makefile`能够被`make`命令解析并执行编译任务,这对于理解项目结构、自动...
【Makefile】是Unix/Linux系统中用于自动化编译、链接和其他构建过程的脚本文件。它定义了一系列规则,告诉操作系统如何构建、测试和安装软件。Makefile中的指令可以帮助程序员节省大量时间,尤其在大型项目中,它...
而Makefile则是构建程序的一种规范文件,它定义了编译、链接等步骤以及相关依赖关系,方便开发者通过简单的命令行指令完成整个工程的构建。在ADS1.2项目中,通常使用内置的IDE进行编译和调试,但有时为了在命令行...
这个主题“cbp转makefile”探讨的是将 Code::Blocks 的 `.cbp` 项目文件转换为通用的 `Makefile`,以便在不同的操作系统,如 Windows 和 Linux 上进行编译。 `.cbp` 文件通常包含了关于项目的所有信息,包括源文件...
Makefile是Linux系统下的一种构建工具,它定义了程序编译和链接的所有规则,使得开发人员能够通过一个简单的命令make来自动构建可执行程序。Makefile手册为读者提供了全面的Makefile使用指南,介绍其语法、编写规则...
《跟我一起写Makefile》是陈皓大佬撰写的一份PDF文档,主要讲解了如何编写和理解Makefile,以便于管理程序的编译和链接过程。Makefile是软件开发中的一个重要工具,它帮助自动化构建过程,使得编译和链接更加高效。 ...
### Makefile核心概念与应用详解 #### 一、Makefile概览 Makefile,作为自动化构建脚本的核心,被广泛应用于软件开发中的编译、链接等任务自动化处理。其核心功能在于通过预定义的规则自动识别文件依赖关系,并...
在Windows平台上,Makefile是构建自动化工具的核心,它允许开发者编写指令来编译、链接以及执行程序,大大提高了开发效率。下面将详细讲解Makefile的基本语法、宏、预处理命令和自动推导规则。 首先,Makefile的...
Makefile是Linux和Unix系统中用于自动化构建、编译、测试等任务的脚本文件,它的存在极大地提高了开发效率,特别是在大型项目中。本篇文章将深入解析Makefile的基础知识,帮助初学者理解并掌握如何编写Makefile。 ...
标题中提到的“Makefile教程”是指关于Makefile的学习资料,而“Makefile快速学习资料”说明本资料是为快速掌握Makefile编写的入门级教程。Makefile是Unix系统中的一个工具程序,主要用于软件开发中的自动化编译。它...
《跟我一起学Makefile》是由陈皓撰写,祝冬华整理的一本关于Makefile学习的PDF教程。Makefile是软件构建过程中的重要工具,尤其在C、C++等编程语言中,它能自动化编译、链接等步骤,提高开发效率。这本书主要针对想...
根据提供的文件信息,本手册详细介绍了Makefile的基础知识和使用方法,尤其适合初学者学习和参考。Makefile是一种生成文件的脚本语言,广泛应用于软件开发中,用于自动化构建和编译程序。以下是从标题、描述、标签和...
Makefile是Unix/Linux环境下的一种构建工具,用于自动化编译、链接和其他相关任务,极大地提高了开发者的工作效率。在软件开发过程中,Makefile定义了一系列规则来指定如何将源代码转换为可执行程序或库。Bash是一种...
### 跟我一起写Makefile #### 第一部分:概述 **Makefile**是一种用于自动化构建过程的脚本文件,在软件开发过程中极为常见。通过编写Makefile,开发者可以定义一系列规则来描述如何编译和链接源代码文件,从而...
### Makefile指南知识点详解 #### 一、Makefile概述与基本概念 **1.1 Makefile的基本作用** Makefile是一种脚本文件,用于自动化构建软件项目。它通过一系列规则来描述如何从源代码构建可执行文件的过程。...
为了提高效率和便捷性,我们可以使用Makefile来自动化这个过程。"为Graphviz定制的Makefile"就是为了解决这个问题而设计的。 Makefile是Unix/Linux系统中用于自动化构建项目的工具,它可以理解一系列规则,根据依赖...
在IT行业中,构建过程是软件开发的关键环节,而Makefile是这个过程中不可或缺的工具。它是一种文本文件,包含了编译、链接等构建步骤的规则,使得开发者能够自动化地管理源代码到可执行文件的转换过程。针对C和C++...