今天在ubuntu下装了个CDT 准备学习C++ 了,但是却发现新建的工程里没有makefile 文件,反正以后肯定
是要用到的先把这玩意过一遍再说…于是开动…鼓捣了一阵子…弄完之后才发现…一开始认为高深莫测
的makefile 其实没有那么神秘..下面我就用我弄的一个简单的例子,来进行一下简单的说明吧.
C++代码:
makefile 内容:
1 # 定义对象变量
2 # mainfile
3 mf = hello.cpp
4 # object
5 obj = hello.o
6 # final file
7 ff = hello
8
9 # 显式定义指令 clean
10 .PHONY: clean
11
12
all : $(obj)
13
g++ $(obj) -o $(ff)
14
$(obj) : $(mf)
15
g++ -c $(mf) -o $(obj)
16
install:
17 cp $(ff)
/sbin/ $(ff)
18 uninstall:
19 rm /sbin/ $(ff)
20 clean:
21 rm -rf *.o $(ff)
C++ 代码不作说明,现在逐行来说明下 makefile 文件
1. 以"#"开头的均属于注释
2. 注释,跳过
3.声明了一个makefile 的变量(也许在makefile 里不该这么叫,但是从coder 角度出发便于理解)
4.注释,跳过
5.声明了又一个变量,在makefile中可以使用"$(变量名)"来调用
6.注释,跳过
7.声明了又一个变量
8.跳过
9.注释跳过
10.显式声明了一个 clean 指令,为什么现实后面做说明
11.跳过
12. 现在进入正题了… 冒号":"之前的,是目标对象,即其所属指令生成的结果,冒号":"之后的,是源文件
,即生成的结果所需的对象.但是在这里 all 不是最终生成的对象,而是一个伪对象,其目的是便于,make
命令,通过参数找到要执行的指令.all 也所 make 命令默认的参数.
13.指令所需要的实际编译命令和参数…此条中即是 将$(obj)最终编译成$(ff),值得注意的 ,命令行之
前必须是一个制表符,否则,编译操作时会报错
14.声明 以 $(mf) 编译为 $(obj)的处理过程
15.声明 以 $(mf) 编译为 $(obj)的处理过程所需要的命令行
16.为 make 命令建立 install 选项
17.为 make 命令建立 install 选项所需要的命令行
18.为 make 命令建立 uninstall 选项
19.为 make 命令建立 uninstall 选项所需要的命令行
20. 为 make 命令建立 clean 选项,在这里我们回到第10行,为什么我们需要显示的声明一条clean 指令
呢?因为,clean这里的clean 实际上是一个伪目标对象,如果你在执行这条指令时候,目录下存在一个名为
clean 的文件的话,此操作就会被认为是生成一个文件而无法执行,为了避免这一情况的出现,所以我们需
要显式声明一些伪目标对象.
21.为 make 命令建立 clean 选项所需要的命令行
综上:我们也可以理解了 为什么很多时候我们 make 之后还要make install了,因为他们通常是两个处理
过程,而win 下装软件,通常make 的过程已经被发行者做过了!
补充:makefile中已预定了一些变量,可以在下面的参考文献中找到这些变量用法
参考文献:
http://skyblue.blogbus.com/logs/95955.html
http://topic.csdn.net/u/20081008/16/002497a1-7568-4d9e-8033-7f5a0880900f.html