`
CJxixi
  • 浏览: 106680 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Makefile上手教程(转载)

 
阅读更多

译者自述:

最开始接触开源软件时,觉得make很神秘,打开makefile,更加深了这种感觉。好在上学时不需要写大型程序,并且C/C++基本只在VC6 下写过,所以一直没有勇气和动力来弄。工作后,尝试使用vim/vimgdb,在里面用gcc很不方面,还是将其写入makefile,直接输入个 make命令来的简单。上网查了下,makefile入门也不是很难,找了很多文章,属这个简单,甚喜。独乐乐不如众乐乐,况翻译一遍能加深印象,故有此 文。

 

书写长长的编译命令是很枯燥无聊而又费时的,尤其是包含多个文件的编译命令。令人高兴的是这种人们必须在命令行中敲入编译的命令的时代已经结束了, 因为我们将使用makefie,在make工具的帮助下实现自动化编译。Makefiles是遵循make工具可以识别的语法规则编写的文件,可以看作是 make的脚本程序。此文中将用到下面这些文件:

我建议您将这些文件放到一个单独的文件夹中来使用。

备注:文中我使用了g++。您可以使用任意的编译器来代替文中的g++。


make工具的使用

如果您在命令行中执行

make

那么make工具将在当前目录中查找是否有名为“makefile ”的文件并执行。如果您有多个makefiles文件,那么您可以使用-f参数来指定将要执行的makefile:

make -f mymakefile

make还有一些其它的参数,若需更多信息,请man make

Build过程

  1. 编译器将源文件编译成object文件
  2. 连接器将object文件链接成可执行文件

手动编译

命令行中直接调用编译器/连接器来的方式:

g++ main.cpp hello.cpp factorial.cpp -o hello

Makefile基本结构

Makefile的基本结构包括:

target: dependencies

[tab] system command

按照这种格式,我们的makefile可以写成这样:

all:

       g++ main.cpp hell.cpp factorial.cpp -o hello

[Download  here ]

若执行这个makefile,在命令行中输入:

make -f Makefile-1

在第一个例子中,我们定义了一个名为all的target。这是Makefile的默认target,如果没有指定其它target的话,make 将会执行这个target。在这里,target all没有指定dependencies,所以make就直接执行g++命令了。

使用依赖

很多时候使用多个target是很有好处的。如果你仅仅是 修改了工程中的一个文件,那么make只需修改那个文件相关的target,而不需要将工程中的文件全部重新编译一遍。

下面是使用多个target的Makefile:

all: hello

hello: main.o factorial.o hello.o

        g++ main.o factorial.o hello.o -o hello

main.o: main.cpp

        g++ -c main.cpp

factorial.o: factorial.cpp

        g++ -c factorial.cpp

hello.o: hello.cpp

        g++ -c hello.cpp

clean:

         rm -rf *.o hello

[Download  here ]

在这里,target all 只有一个dependencies,没有系统命令。make会首先满足all的依赖,方法是搜索依赖的target,并执行。依赖的target也许有自 己的依赖和命令,那么这个过程递归进行,知道所有的依赖都得到满足。在这个例子中,我们看到有个名为clean的target。这个一般都是用于清理所有 的objects和可执行文件。

使用变量和注释

在Makefile中,您也可以定义和使用变量。当需要批量修改编译器参数时,使用变量是很方便的。

#I am a comment, and I want to say that the variable CC will be

#the compiler to use

CC=g++

#Hey! I am comment nuber 2, I want to say that CFLAGS wiil be the

#options I'll pass to the compiler

CFLAGS=-c -Wall

all: hello

hello: main.o factorial.o hello.o

        $(CC) main.o factorial.o hello.o -o hello

main.o: main.cpp

        $(CC) $(CFLAGS) main.cpp

factorial.o: factorial.cpp

        $(CC) $(CFLAGS) factorial.cpp

hello.o: hello.cpp

        $(CC) $(CFLAGS) hello.cpp

clean:

        rm -rf *.o hello

[Download  here ]

正如上面所示,变量是十分有用的。定义和使用变量的方式很简单,在写target之前将一个值赋给一个变量即可完成定义,使用$(VAR)可以获得变量值。

 

Where to go from here

With this brief introduction to Makefiles, you can create some very sophisticated mechanism for compiling your projects. However, this is just a tip of the iceberg. I don't expect anyone to fully understand the example presented below without having consulted some  Make documentation   (which I had to do myself) or read pages 347 to 354 of your Unix book.

CC=g++
CFLAGS=-c -Wall
LDFLAGS=
SOURCES=main.cpp hello.cpp factorial.cpp
OBJECTS=$(SOURCES:.cpp=.o)
EXECUTABLE=hello

all: $(SOURCES) $(EXECUTABLE)
	
$(EXECUTABLE): $(OBJECTS) 
	$(CC) $(LDFLAGS) $(OBJECTS) -o $@

.cpp.o:
	$(CC) $(CFLAGS) $< -o $@


[Download  here ]

If you understand this last example, you could adapt it to your own personal projects changing only 2 lines, no matter how many additional files you have !!!.

下一步的学习

完成文中的例子后,您已经可以写一个基本的makefile了。然而,这里的东西仅仅是冰山一角,我没指望所有人都能在不查Make documentation 的情况下完全理解下面的代码(即使我自个儿也得查了才明白)。

CC=g++

CFLAGS=-c -Wall

LDFLAGS=

SOURCES=main.cpp hello.cpp factorial.cpp

OBJECTS=$(SOURCES: .cpp =.o)

EXECUTABLE=hello

all: $(SOURCES): $(EXECUTABLE)

$(EXECUTABLE): $(OBJECTS)

         $(CC) $(LDFLAGS) $(OBJECTS) -o $@

.cpp.o:

         $(CC) $(CFLAGS) $< -O $@

[Download  here ]

如果您能理解这段代码,那么无论您的工程含多少个文件,只需修改其中两行这个makefile便可用于您的工程。

分享到:
评论

相关推荐

    Makefile 中文教程.pdf

    Makefile 中文教程.pdf Makefile 作为一个自动化编译工具,在软件开发过程中扮演着非常重要的角色。Makefile 的主要作用是根据源代码文件生成目标文件,实现自动化编译和链接的过程。 Makefile 的基本概念 ...

    makefile教程(中文版),makefile入门,LINUX

    【转载】跟我一起写Makefile,写makefile的教程,可以快速上手写出makefile

    makefile教程(中文版).rar

    这篇中文版的`Makefile`教程详细介绍了如何编写和使用`Makefile`,以提高软件构建的效率。`Makefile`是基于规则的文件,其中包含了构建项目的一系列指令,使得构建过程可以简洁、高效地进行。 `Makefile`的基本结构...

    Makefile经典教程(最掌握这部分足够).pdf

    ### Makefile经典教程知识点概述 #### 一、Makefile的重要性及背景 - **定义与作用**:Makefile是一种用于描述项目构建过程的脚本文件,主要用于自动化编译过程。它规定了项目的编译顺序和规则,是软件工程中不可...

    makefile完整教程 pdf

    这份“makefile完整教程”无疑为想要深入理解和掌握这一工具的学习者提供了一份宝贵的资源。在学习过程中,以下几个关键知识点是必须掌握的: 1. **基本结构与规则**: - `Makefile`通常包含一系列规则,每个规则...

    Makefile经典教程(最掌握这部分足够---因为汇集全部精华)!

    【标题】"Makefile经典教程(最掌握这部分足够---因为汇集全部精华)!" 提供的是一份关于Makefile的深入学习资源,它包含了Word和PDF两种格式的文档,旨在帮助用户全面理解并熟练掌握Makefile的使用。 【描述】中的...

    Makefile经典教程

    Makefile 经典教程 Makefile 是一个自动化编译工具,在 Unix/Linux 环境下广泛应用。它可以将编译过程自动化,从而提高软件开发的效率。Makefile 由一系列规则组成,指定了源文件的编译顺序、依赖关系和编译命令。 ...

    Makefile 基础教程.pdf

    Makefile 基础教程 Makefile 是一种特殊格式的文件,用于自动构建和管理项目。在 Unix、Linux 及其版本上运行的程序构建工具,帮助简化可能需要各种模块的构建程序可执行文件。Makefile 中定义的规则和依赖关系指导...

    Makefile完全教程PDF

    ### Makefile完全教程知识点概述 #### 1. Makefile的重要性及背景 Makefile在软件开发领域扮演着核心角色,尤其在Unix环境下。虽然Windows的IDE(集成开发环境)如Visual Studio或Eclipse提供了自动化构建的功能,...

    makefile实用教程汇编

    ### makefile实用教程知识点汇编 #### 一、Makefile概览 - **定义**:Makefile是一种用于自动化编译过程的脚本文件,通过它能够管理复杂的项目编译流程,尤其是在Unix/Linux环境下广泛使用。 - **作用**: - 自动...

    Makefile经典教程.doc

    【Makefile经典教程】 在软件开发中,尤其是Unix和Linux环境下,Makefile是一个不可或缺的工具,它定义了项目中各种文件之间的依赖关系以及构建规则。本文将深入探讨Makefile的编写经验,帮助开发者理解并掌握这一...

    Makefile经典教程(最掌握这部分足够---因为汇集全部精华)!!!!!!!!!!.pdf

    ### Makefile经典教程知识点梳理 #### 一、Makefile概览 **Makefile**是一种用于自动化构建过程的脚本文件,广泛应用于软件工程领域。它主要用于定义如何编译和链接程序,通过设置一系列规则来控制文件的依赖关系,...

    makefile入门教程

    本文档作为makefile入门教程,旨在引导初学者理解makefile的基本概念、编写规则、命令书写、变量使用、条件判断、函数使用、make的运行、隐含规则以及如何使用make来更新函数库文件等方面的知识。 首先,makefile的...

    Makefile中文教程

    【Makefile中文教程】 在Linux系统中,编程项目往往包含多个源文件,为了高效管理和编译这些文件,Makefile成为了不可或缺的工具。本教程旨在帮助初学者理解和掌握Makefile的编写技巧,以便在编程过程中更加便捷地...

    Linux下makefile教程

    ### Linux下Makefile教程知识点详解 #### 一、Makefile简介 Makefile 是一种用于自动化构建过程的脚本文件,在 Linux 和 Unix 类操作系统中极为常见。通过定义一系列规则,Makefile 能够自动构建出所需的可执行文件...

    makefile教程

    Makefile 教程 Makefile 是一种自动构建工具,广泛应用于各种软件开发项目中。下面是 Makefile 教程的知识点总结: 概述 Makefile 是一种脚本文件,用于描述如何编译和构建软件项目。它由一系列的规则和命令组成...

    makefile经典教程

    【Makefile 经典教程】 Makefile 是一种用于自动化构建项目的文本文件,它定义了项目的构建规则,包括编译和链接的过程。在Unix和类Unix系统中,如Linux,Makefile是项目管理的重要组成部分,特别是在大型工程中,...

Global site tag (gtag.js) - Google Analytics