这是一篇关于Makefile的简单教程的翻译,原帖英文在http://mrbook.org/tutorials/make/。
由本人翻译整理,你可以随意转载,但请不要更改内容并注明本帖来源(http://www.cnblogs.com/silikmel)。
Makefile by examples
编译你的源代码文件是一件挺讨厌的事儿,特别是当你想要包含几个源代码文件时,你必须每次都要敲击编译命令。
好吧,这里有个好事儿,这一切的繁琐都要结束了。因为你在这里将会学习到如何编写Makefile。
Makefile是一种特定的文件,可以帮助你自动的编译和管理你的项目。
为了后面的学习,请你先下载这4个文件:
http://mrbook.org/tutorials/make/main.cpp
http://mrbook.org/tutorials/make/hello.cpp
http://mrbook.org/tutorials/make/factorial.cpp
http://mrbook.org/tutorials/make/functions.h
我建议建立一个新的文件夹来存放这些文件
注意:我使用g++作为编译器,你们自己可以使用其他或你们自己电脑上的编译器。
make功能
如果你运行
make
这个程序会在当前目录寻找一个叫做makefile的文件,并执行它。如果你有许多makefile文件,则你可以下面的命令去执行他们:
make -f MyMakefile
未尽事宜,请查看man make
编译过程
用手编译
这是一个麻烦的方法编译一个程序并且得到可执行程序,命令如下:
g++ main.cpp hello.cpp factorial.cpp -o hello
基本的Makefile
一个基本的Makefile有如下的两部分组成:
target:dependencies
[tab] system command
应用在刚才那个例子中,便形成如下形式:
all: g++ main.cpp hello.cpp factorial.cpp -o hello
在这里下载http://mrbook.org/tutorials/make/Makefile-1
要运行这个makefile,可以输入:
make -f Makefile-1
在这个例子中我们发现我们的目标被叫做all。这是makefile默认的目标。如果没有其他目标,make工具会执行这个目标。我们也看到目标all上没有dependencies,所以make可以很安全的执行这个具体的系统命令。最后,make依据我们给定的语句编译了程序。
使用dependencies
有时候对于不同目标,dependencies是很有用的。这是因为想更改一个工程中的一个单一文件并没有必要重新编译所有的程序。只编译你更改的就好了。
所以我们有了如下的例子:
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
下载地址:http://mrbook.org/tutorials/make/Makefile-2
现在我们看见目标all有一个dependency,但是没有系统命令。如果make依次执行正确,它必须符合被叫目标所有的dependencies。(这个例子中,all)
每一个dependency都会被搜索,如果找到就会被执行。
在这个例子中,我们发现一个叫clean的目标,它是用来让你的免除众多目标文件和可执行文件的拖累,从而让编译过程更快。
使用变量和注释
当你编写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 number 2. I want to say that CFLAGS will 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
下载位置:http://mrbook.org/tutorials/make/Makefile-3
就像你看到的,变量有时候非常有用。使用他们,你可以在开始的时候赋一个值。之后你可以用用逆向引用操作符$(VAR)来使用他们。
扩展阅读
在对makefile有了初步了解之后,你可以使用makefile去建立一些非常复杂的工程。但是,这仅仅是makefile的冰山一角。如果没有一些别的资料,我不期望每个人都能使用makefile每一个功能。
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 $@
如果你能明白最后一个例子,你可以修改其中的2行去适应各种你自己的工程。无论有多少文件。
原文:http://www.cnblogs.com/silikmel/p/3547378.html