目录
第一部分:
这里不再说Makefile的基本知识,如果需要学习,那么请参考: 下载:makefile 中文手册或者点击打开链接或者跟我一起写Makefile( 陈皓 )
这里说的是一般的实际的一个工程应该怎么去写。
环境:ubuntu 10.04
先看看我的文件的分布情况:
顶层:
![](https://i-blog.csdnimg.cn/blog_migrate/390713a79c5e0ac281a6acf5285881b5.jpeg)
然后src中:是所有的源程序以及头文件( 我这里是使用自己的IR树的代码作为实验 )
![](https://i-blog.csdnimg.cn/blog_migrate/f23b8a521dd1670387738fd60f48a334.jpeg)
而build文件夹是为了编译使用的!下面有:
![](https://i-blog.csdnimg.cn/blog_migrate/a9ffbcfa73e64d49541a953e42cc0672.jpeg)
obj文件夹里面放的是编译过程中的.o和.d文件,还有一个subdir.mk的子文件,用于指示怎么生成.o
obj中:
![](https://i-blog.csdnimg.cn/blog_migrate/bcd13e916d6493f7da96f99b85a41869.jpeg)
下面我们从顶层开始慢慢分析:
*******温馨提示:下面的注释是为了方便处理,写在每一条语句后面,其实这样的风格是不好的,所以,如果
你使用了这个makefile,请将注释换行...或者去掉,否则可能编译异常!谢谢记住!
*******
最外层的makefile:
SHELL = /bin/sh # 这个地方是指示使用的shell是sh
EXEC = ir_tree # 最终生成的binary的名称
BUILD_DIR = build # 这个子文件夹,此处也就是我们build文件夹
all: # all在此处是终极目标,这个你应该知道的。一般我们make的时候,第一个目标作为终极目标
@( cd ${BUILD_DIR}; make ) # 这句是进去build文件夹去执行那个makefile
clean: # clean就不说了
@echo 'start clean...'
@($(RM) $(EXEC))
@(cd ${BUILD_DIR}; make clean)
@echo 'Finished!'
@echo ''
现在进入build文件夹,看这个文件夹下面的makefile
SHELL = /bin/sh # 同上
INCLUDE_DIR := # include文件夹,一般我们在引用库的时候,需要将其头文件放在一个include中,然后自己的程序 # 编译的时候需要包含这个include,例如-I$(<span style="font-family: SimHei;">INCLUDE_DIR</span><span style="font-family: SimHei;">)</span>
LIB_DIR := -lm # 引入的库
EXEC = ../ir_tree # 这是一个最终binary名称,这里是将这个可执行放在了上层文件夹中
-include obj/subdir.mk # 这个地方是include了一个子文件
# 这里子文件作用是,为了生成所有的.o文件(当然附带生成.d文件!),生成.o之后,才能回到这一 # 层的makefile进行链接成最终的可执行的操作!具体操作我们稍后再看
all:${EXEC} # 好!这里是这个makefile的第一个目标。即终极目标,所有需要找
${EXEC}: ${OBJS} # ${EXEC}的生成规则,注意这里我们没有看到$(OBJS),那是因为在obj/subdir.mk中!
@echo ' Building target: $@ '
gcc -o $@ $(OBJS) $(LIB_DIR) # 这一句就是为了将所有的.o文件 + 引用的库 链接起来,生成最后的$@,也就是$(EXEC),也就是最后的binary!
@echo 'Finished building target: $@'
@echo ''
clean:
@