多重目录环境下的makefile分享

学习了几天的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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值