学习了几天的makefile之后,为自己写的程序写了几个makefile,分享给大家。
因为水平有限,适用于初学者,高手就请手下留情,不要打击太多哦!
1 适用范围为目录结构如下的工程:
|
|---> build/ 这个是用来总编译的目录,存放了根makefile和编译生成的中间文件和最后的可执行文件
|
|
|---> src/ 这个是根源码目录
|
|
|---> include 这个是通用头文件存放目录
|
|
|-> a 这个是子模块的源码目录,存放子模块c文件和子makefile文件
|
|---> include 这个是子模块内部的头文件存放目录
|
|-> b 下面的都是一样的 …………
|
|---> include
|
|-> c
.
.
.
如果你的工程目录也是这样的话,你就可以使用我写的这个makefile结构了。如果目录类似,可能需要稍微修改makefile
2 编译特点:
每个子模块生成出一个.o文件,文件名就是目录名加.o的后缀。也就是说,目录a的c文件会生成出a.o,目录b的生成出b.o,都存放在build目录下。最后链接出的可执行文件也是放在build下面的。
3 优点:
a,最基本的,使用了gcc -MM自动生成依赖关系,除去了手工维护依赖关系的成本。
b,删除子目录,或者更改子目录名字,(比如将目录b改为ergo),不需要更makefile。
c,增加子目录,只需要将任意一个现存子目录下的makefile拷贝到新的子目录下即可,无需其他改动。
d,任何c文件和头文件的增加,删除和改动不需要改动makefile。
e,src目录下面永远都只有源文件,感觉上比较干净。
4缺点:
a,如果子目录中文件太多,改动其中一个文件都需要编译整个子目录中的所有文件。
b,不使用gcc的时候要注意修改makefile,你可以使用if语句来做判断。因为我只使用gcc,所以懒得改了。
c,只支持简单的make和make clean,如果你要高级用法,自己加吧。
d,依赖关系的处理很山寨,不是标准的.d文件做的。
5 makefile源代码:
其中哪些是tab哪些是空格大家应该知道,就不说了。
根makefile:
CC=gcc
srcPath=../src/
sources:=$(wildcard ../src/*)
sources:=$(filter-out %include,$(sources))
objects:=$(sources:%=%.o)
objects:=$(notdir $(objects))
main: $(objects)
$(CC) -o $@ $^
%.o:
cd $(srcPath)$* && $(MAKE)
.PHONY: clean
clean:
-rm *.o main
子makefile:
buildPath:=../../build/
CC=gcc
ojbect:=$(shell pwd)
ojbect:=$(notdir $(ojbect)).o
sources:=$(wildcard *.c)
rely:=$(foreach file,$(sources),$(shell $(CC) -MM $(file)))
rely:=$(filter-out %.o:,$(rely))
$(buildPath)$(ojbect): $(rely)
$(CC) -combine -c $(sources) -o $@
.PHONY: clean
clean:
rm $(buildPath)$(ojbect)
好了,如果大家有什么疑问可以在qq上交流:14228350