Makefile入门

转载 2016年05月31日 14:15:34

Makefile的写法入门心得

 

Makefile的出现使得编译过程极大地自动化了,省去了很多人工工作,非常方便。这里,小结一下写Makefile的一点小心得。嗯,对了,差点忘了一件事,同一个Makefile在不同的内核版本和Linux发行版本中不一定能发挥一样的作用,别人的Makefile可不见得就适用于自己的机器。

我先简单说一下我自己的机器: Ubuntu12.04-Kernel-3.4.5,内核是根据我自己机器的配置裁剪过的,不过估计这个影响不大,当然,大神们就别批小弟了,咱的水平还不至于写非常贴近底层的东西。

好了,开始介绍。

下面是一个在网上非常泛滥的模板,虽然泛滥,但就是没有一个人把这个模版做一个剖析,我这个菜鸟就勉强试一试好了。事前说明:如果在每一段的最前面有空格的,记住那是tab键,是Makefile里面专门用于写命令时固定的格式:

 

#Source file
SRC = ThreadQueue.cpp
#Object file
OBJ = $(SRC:.cpp=.o)
#Output execution file
PROGRAM = ThreadQueue
#Compiler
CC = g++


#Include
INCLUDE = -I/usr/include/ncurses –I/usr/include/
#Linker Parameter
LINKPARAM = -lpthread -lncurses
#Options for development
#CFLAGS = -g

#Options for release
CFLAGS = -o


all: $(PROGRAM)

$(PROGRAM): $(OBJ)

    $(CC) -o $(PROGRAM) $(LINKPARAM) $(OBJ)

.SUFFIXES : .cpp

.cpp.o:

    $(CC) $(INCLUDE) $(CFLAGS) -c $<

clean:
    -rm *.o

下面一行一行的来解析这个makefile。

首先解释第一行以及好多行都出现的“#”号,注释,完全是注释,跟C语言中的//是一样的,在标准的Linux内核Makefile中有很多内容都是帮你理解的注释。

第二行是一个变量的定义,变量名为SRC,变量定义为ThreadQueue.cpp,这样要引用变量时写作“$(变量名)”即可,就等价为变量的定义内容。

第三行注释,读读就好。

第四行这里又定义了一个变量,请注意,它的定义引用了SRC变量,同时,用到了变量替换,这里

SRC:.cpp=.o的意思是指将SRC下所有以.cpp结尾的文件的.cpp替换为.o,也就定义了要输出的所有文件。

第五行,注释的说。

第六行是定义变量,这里顺便再一提,这个就是我们在编译过程中最后要得到的东西,即ThreadQueue.o。

第七行又是注释的说。

第八行的变量定义是指CC代表的就是gcc编译器。嗯,据我自己这几天的经验,绝大部分Makefile(包括标准的Linux Makefile)都是这么写的。

第九行(这里是指有内容的第九行,不包括空行)注释的说。

第十行,又是一个变量定义,这里就得交待一件事情了:在Makefile中变量的定义是很灵活的,基本可以理解为C语言下的宏定义,你定义神马都可以,你可以用变量来定义一个文件名列表,定义一个可执行文件名,也可以把变量定义成编译器命令选项。

第十一行,注释的说。

第十二行,这里也是一个变量的定义,这个变量作为gcc编译时的编译器选项使用。

第十三至十五行皆是注释,不过这三行以及下面的第十六行还是有其他作用的,待到十六行处再讲。

第十六行,这里连带着上面的三行一起讲,看英文也应该看出来这里四行的作用了。是这样的,如果你是想自己要调试用的话,你就保留“options for develop”下面的那一行,把之前的“#”号去掉,而你要是想生成不可调试的发行版,那就选择让第十六行生效。这里,为什么会有这样的区别就涉及到gcc编译器使用选项的问题了,留做他日再写。

第十七行,all是一个标签,你可以理解成一个跳转符号,如果想让make程序在编译时执行某一个特定的指令,就可以把这个指令做成一个标签,这样在命令行里输入“make Name_of_Your_Label”就可以执行某一特定部分的编译了。

第十八、十九、二十行,来到这里就不得不提一般的Makefile的书写格式了,这也是为什么我要把三行在一起交待,如下:

目标:依赖

    命令

    ……

必须注意的是,命令前面的不是空格,而是制表符Tab,这是Makefile书写时必须遵循的规则。那我们看到上面的模板中,我们要生成的是PROGRAM所代表的变量,而所需要的依赖就是OBJ中所有的.o文件,生成时的命令是“$(CC)-o $(PROGRAM) $(LINKPARAM) $(OBJ)”,根据他们各自的变量定义可知,之一段命令可以翻译为“gcc –o ThreadQueue -lpthread –lncurses ThreadQueue.o”,其中前面带有-的几个字母都是gcc编译时的选项,改天再总结一下gcc编译器的使用。

第二十一行,这里的“.SUFFIXES”是一个伪目标,它的作用类似于一个标签,在伪目标之后的所有内容将不会被检查是否已经执行,而是将它直接执行。

第二十二、二十三行,这里.cpp.o是老式的“后缀规则”,编译器将会自动将.cpp识别为源文件后缀,而.o识别为输出文件后缀。,SUFFIXES也是习惯上用来定义后缀规则的伪目标。特别需要注意的是,后缀规则不允许任何依赖文件,但也不能没有命令。

第二十四、二十五行,这里定义了clean命令的执行规则,以及所要清除的文件的后缀名,如果你还想在clean时清除什么后缀的文件的话,就再写上”*.post_name”即可,非常方便。

 

小结:Makefile的写法还是比较复杂的,我这一篇文章只提及了很少的一点,给大家推荐一个人的博客,他曾经写过《跟我一起学写Makefile》,希望该大神的博客能对你有所帮助:http://blog.csdn.net/haoel/article/details/2886

Makefile 入门与基本语法

在我看来,学会写简单的Makefile,阅读较复杂的makefile,是每一个Linux程序员都必须拥有的基本素质。Makefile可以自动识别哪些源文件被更改过,需要重新编译,那些不需要。从而节省大...
  • Paul_C_V
  • Paul_C_V
  • 2015年05月18日 11:16
  • 6125

makefile书写入门

首先声明,本篇文章是根据陈皓博客中的相关文章改写的。原因是那篇文章太全面了,而本文抽取了其中比较实用的几点,以一个使用者的角度来说明一下,makefile改怎么写,而且只限定是linux下的C语言的m...
  • cyfcsd
  • cyfcsd
  • 2016年07月29日 16:54
  • 1726

linux下Makefile用法(基础)

掌握make的用法,Makefile的内容,能在linux下C++编程。
  • jhgkjhg_ugtdk77
  • jhgkjhg_ugtdk77
  • 2016年07月25日 16:57
  • 1426

Makefile经典教程(掌握这些足够)

ruglcc's blog 研发7年,专注于 iOS Android Linux Github->https://github.com/ruglcc 目...
  • special00
  • special00
  • 2016年04月07日 11:44
  • 2247

Android编译系统入门(一)

做过Android平台开发的朋友对make,mm或make clean命令应该很熟悉,但也许大家只是熟知这些命令的作用却不知道这些命令底下有些什么原理?那么今天我就带着大家推开Android编译系统的...
  • zqlite
  • zqlite
  • 2015年12月03日 12:41
  • 1252

【slighttpd】基于lighttpd架构的Server项目实战(4)—简单的echo服务器

在这一部分,我们将对上一篇中的master-worker进行拓展,成为一个简单的echo服务器。这一步我们需要添加两个类:Listener和Connection;Listener的职责: 创建监听套接...
  • jiange_zh
  • jiange_zh
  • 2016年02月04日 23:23
  • 968

NDK编译基础示例

本篇博文参考了非虫大大的Android软件安全与逆向分析,这真的是一本好书,里面涵盖的内容比较全也比较基础。下面开始我们的学习。 Android为了提高效率、安全性等,提供了NDK(原生开发套件),现...
  • u012195899
  • u012195899
  • 2016年09月30日 12:15
  • 1248

Makefile入门:最常用最简单的Makefile

http://blog.csdn.net/livelylittlefish/article/details/3854220  本博客(http://blog.csdn.net/livelyli...
  • zxygww
  • zxygww
  • 2015年10月13日 14:55
  • 407

makefile 详细用法之二

最近在学习Linux下的C编程,买了一本叫《Linux环境下的C编程指南》读到makefile就越看越迷糊,可能是我的理解能不行。             于是google到了以下这篇文章。通俗易懂...
  • dapengbusi
  • dapengbusi
  • 2016年09月18日 16:37
  • 1140

Linux下C++的通用Makefile与解析

本文给出万能Makefile的具体实现,以及对其中的关键点进行解析。所谓C++万能Makefile,即可编译链接所有的C++程序,而只需作很少的修改。 号称万能Makefile,一统江湖。我对原版的...
  • zhoujiaxq
  • zhoujiaxq
  • 2014年05月16日 13:54
  • 10385
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Makefile入门
举报原因:
原因补充:

(最多只允许输入30个字)