当前位置: 技术问答>linux和unix
makefile初学者指南
来源: 互联网 发布时间:2016-04-08
本文导语: 刚翻译的,只针对对makefile的初学者,非初学者请pass,免得乱费你的时间。 Makefile 初学者指南 翻译: www.csdn.net guosha(田伯光) 原文地址:http://mrbook.org/tutorials/make/ 想像一下,你的程序有许多源文件,而当...
刚翻译的,只针对对makefile的初学者,非初学者请pass,免得乱费你的时间。
翻译: www.csdn.net guosha(田伯光)
原文地址:http://mrbook.org/tutorials/make/
想像一下,你的程序有许多源文件,而当你想编译这个程序时需要手动输入每一个编译指令会是一件多么枯燥无味的事情。让人觉得庆幸的是,你可以有更好方法,当你学会了写Makefile后,你就再也不用天天手动输入编译指令来编译你的程序了。Makefile是一个遵循特殊规则的文本文件,跟make工具一起可以帮助你自动创建和管理你的工程。
在进一步的学习之前,你需要以下几个文件:
main.cpp
hello.cpp
factorial.cpp
functions.h
另外我建议你新建一个新的目录,然后把这些文件都入到这个新建的目录下去.
注意:我使用g++来编译,你可以选择任何你喜欢的编译器
make 工具
当你在shell下执行命令
make
这个程序会在当前目录查找一个名为makefile的文件,然后执行这个文件,如果当前目录里有多个makefile文件,你可以使用如下命令在执行时定制使用哪一个makefile文件:
make -f MyMakefile
make工具还有一些其它的选项,你可以man make来得到这些选项的信息。
创建可执行程序的过程
1、编译器把源文件编译成目标文件
2、链接器把目录文件链接成可执行程序
手动编译
一个不可取的方法去编译源文件得到目标文件是通过手动执行下面的命令:
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
把上面这段文字保存为Makefile, 然后执行make就可以执行这个Makefile文件。在这个例子里,我们可以看到makefile的目标是all, 这是makefile文件的默认目标。如果没有定义其它目标,make工具会执行这个目标。同样我们可以看到目录all并没有依赖任何其它的东西,所以make可以肯定会执行后面定义的命令。最后,make会按照给出的命令编译我们的程序。
使用依赖
有时候,使用不同的目标会非常的有用。这是因为当你只改了你工程里的一个文件时,你只需要把有改动的文件编译一次,而并不需要把整个工程重新编译一遍。下面给出了例子:
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
现在我们可以看到all只有一个依赖关系,并没有相应的系统命令。为了让make正确的执行,终极目标的所有依赖关系都必须符合(这里是all)。make会搜索每一个目标的依赖关系并试着执行相应的系统命令。
在这里我们可以看到有一个名为clean的目标,这个目标用于当你想快速删除所有生成的目标文件和可执行文件的时候,只需要在shell提示符下简单的输入make 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
如上所示,你会发现变量在写makefile的时候非常的有用。通过变量,你可以在写你的目标规则前把一个值赋给一个变量。然后,你可以使用$(VAR)来表示实际的内容。
进一步的学习
通过上述对makefile的简略介绍,你可以创建一些非常普通的makefile文件来编译你的项目。然而这只是有关make的冰山一角。我想如果没有仔细参阅一些其它的有关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) $
Makefile 初学者指南
翻译: www.csdn.net guosha(田伯光)
原文地址:http://mrbook.org/tutorials/make/
想像一下,你的程序有许多源文件,而当你想编译这个程序时需要手动输入每一个编译指令会是一件多么枯燥无味的事情。让人觉得庆幸的是,你可以有更好方法,当你学会了写Makefile后,你就再也不用天天手动输入编译指令来编译你的程序了。Makefile是一个遵循特殊规则的文本文件,跟make工具一起可以帮助你自动创建和管理你的工程。
在进一步的学习之前,你需要以下几个文件:
main.cpp
hello.cpp
factorial.cpp
functions.h
另外我建议你新建一个新的目录,然后把这些文件都入到这个新建的目录下去.
注意:我使用g++来编译,你可以选择任何你喜欢的编译器
make 工具
当你在shell下执行命令
make
这个程序会在当前目录查找一个名为makefile的文件,然后执行这个文件,如果当前目录里有多个makefile文件,你可以使用如下命令在执行时定制使用哪一个makefile文件:
make -f MyMakefile
make工具还有一些其它的选项,你可以man make来得到这些选项的信息。
创建可执行程序的过程
1、编译器把源文件编译成目标文件
2、链接器把目录文件链接成可执行程序
手动编译
一个不可取的方法去编译源文件得到目标文件是通过手动执行下面的命令:
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
把上面这段文字保存为Makefile, 然后执行make就可以执行这个Makefile文件。在这个例子里,我们可以看到makefile的目标是all, 这是makefile文件的默认目标。如果没有定义其它目标,make工具会执行这个目标。同样我们可以看到目录all并没有依赖任何其它的东西,所以make可以肯定会执行后面定义的命令。最后,make会按照给出的命令编译我们的程序。
使用依赖
有时候,使用不同的目标会非常的有用。这是因为当你只改了你工程里的一个文件时,你只需要把有改动的文件编译一次,而并不需要把整个工程重新编译一遍。下面给出了例子:
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
现在我们可以看到all只有一个依赖关系,并没有相应的系统命令。为了让make正确的执行,终极目标的所有依赖关系都必须符合(这里是all)。make会搜索每一个目标的依赖关系并试着执行相应的系统命令。
在这里我们可以看到有一个名为clean的目标,这个目标用于当你想快速删除所有生成的目标文件和可执行文件的时候,只需要在shell提示符下简单的输入make 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
如上所示,你会发现变量在写makefile的时候非常的有用。通过变量,你可以在写你的目标规则前把一个值赋给一个变量。然后,你可以使用$(VAR)来表示实际的内容。
进一步的学习
通过上述对makefile的简略介绍,你可以创建一些非常普通的makefile文件来编译你的项目。然而这只是有关make的冰山一角。我想如果没有仔细参阅一些其它的有关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) $