本文主要是介绍makefiles快速上手简单教程,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
原文地址:http://mrbook.org/tutorials/make/
jubincn的中文翻译http://blog.csdn.net/jubincn/article/details/7161631
书写长长的编译命令是很枯燥无聊而又费时的,尤其是包含多个文件的编译命令。令人高兴的是这种人们必须在命令行中敲入编译的命令的时代已经结束了,因为我们将使用makefie,在make工具的帮助下实现自动化编译。Makefiles是遵循make工具可以识别的语法规则编写的文件,可以看作是make的脚本程序。此文中将用到下面这些文件:
- main.cpp
- hello.cpp
- factorial.cpp
- functions.h
备注:文中我使用了g++。您可以使用任意的编译器来代替文中的g++。
我运行这些文件后发现有问题,做了如下修改:针对main.cpp和hello.cpp两个文件,将<iostream.h>换成<iostream>即可;两个文件都添加:using namespace std;
make工具的使用
如果您在命令行中执行
make
那么make工具将在当前目录中查找是否有名为“makefile”的文件并执行。如果您有多个makefiles文件,那么您可以使用-f参数来指定将要执行的makefile:
make -f mymakefile
make还有一些其它的参数,若需更多信息,请man make
Build过程
- 编译器将源文件编译成object文件
- 连接器将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)可以获得变量值。
完成文中的例子后,您已经可以写一个基本的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文件没有看懂,得好好研究一下了。
参考文献:
http://mrbook.org/tutorials/make/
http://blog.csdn.net/jubincn/article/details/7161631
http://wiki.ubuntu.org.cn/%E8%B7%9F%E6%88%91%E4%B8%80%E8%B5%B7%E5%86%99Makefile:MakeFile%E4%BB%8B%E7%BB%8D
http://web.mit.edu/gnu/doc/html/make_3.html
http://www.cs.umd.edu/class/fall2002/cmsc214/Tutorial/makefile.html
这篇关于makefiles快速上手简单教程的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!