- 浏览: 104292 次
- 性别:
- 来自: 上海
最新评论
-
marx:
marx 写道make: *** No targets spe ...
php 性能分析工具xhprof使用手册 -
marx:
make: *** No targets specified ...
php 性能分析工具xhprof使用手册
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过程
- 编译器将源文件编译成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)可以获得变量值。
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便可用于您的工程。
发表评论
-
Discuz插件编写教程
2013-10-21 15:23 2114Discuz插件编写教程: 1, ... -
Android
2012-12-25 13:48 9121. 请描述下 Activity ... -
c++ socket 消息构建
2012-10-10 11:14 909客户端 : /* client.c 向 ... -
linux 消息队列 实例
2012-09-25 11:42 1026前言: 消息队列就是一个消息的链表。可以把消息 ... -
Linux 信号signal处理机制
2012-09-24 15:55 838信号是Linux编程中非常重要的部分,本文将详细介绍信号机制的 ... -
C++ TinyXml操作(含源码下载)
2012-09-24 15:18 971前言 TinyXML是一个 ... -
linux下C与C++混合编程
2012-09-21 10:36 1700首先,混合编程不是指在同一个文件里写C与C++。 比如说想 ... -
Linux 下编译C程序
2012-09-20 11:58 3150GCC 已不再是主要针对GNU项目自身的软件的小型 C ... -
VS2010快捷键
2012-09-10 15:30 787VS2010快捷键 有人发了VS2 ... -
mysql 备份
2011-06-10 16:15 4181,直接将MySQL数据库压缩备份,不能在mysql模式下使用 ... -
Apache 虚拟机简单配置
2011-03-24 11:57 4878Apache 虚拟机简单配置 配置虚拟机主要是基于主机 ... -
svn的使用
2011-03-17 16:10 10401,svn中有几个重要的概念:branche,tag,trun ... -
社交网页游戏解析之产品篇
2010-06-03 15:20 993转载 ... -
常见手机参数含义
2010-05-18 14:45 10801,屏幕大小:如3.5英寸,它是指手机屏幕对角线的长度。 ... -
Memcache的使用和协议分析详解
2009-08-13 15:44 867作者:heiy ... -
CS vs BS
2009-08-07 09:12 1702C/S又称Client/Serv ... -
优秀网站源码、编程源码下载网站大集中
2009-08-06 17:41 941优秀网站源码、编程源码下载网站大集中 1.51源码:ht ...
相关推荐
makefile教程makefile教程makefile教程makefile教程makefile教程makefile教程makefile教程makefile教程makefile教程makefile教程makefile教程
Makefile 中文教程.pdf
【转载】跟我一起写Makefile,写makefile的教程,可以快速上手写出makefile
Makefile经典教程
Makefile中文教程 Makefile 中文教程 Linux 系统 编程
Makefile经典教程 介绍了makefile的写法经验等等
linux makefile
非常完整的makefile教程,找了很久才找到的,想学习makefile的同学值得下载
makefile经典教程
linux操作系统下,为实现编译自动化,编写makefile脚本,本文档makefile入门教程
Makefile经典教程(最掌握这部分足够---因为汇集全部精华)!!!!!!!!!!.pdf
makefile中文完全教程,需要的赶快下了
一个不错的Makefile教程~ 通俗易懂,很适合初学者~
Linux下Makefile教程,结合实例详细介绍Linux下的Makefile编写规则和技巧,欢迎下载。
Linux gcc/g++ Makefile基础教程.zip
linux开发makefile编写教程,可以作为参考。
makefile简明教程 makefile简明教程 makefile简明教程
菜单: Comments Rules Dependency Lines Shell Lines Macros Macro Modifiers Inference Rules Response Files Makefile Directives