工程管理器makefile的解释及简单模型

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/adlics_r/article/details/51865871

工程管理器(makefile)

工程:很多源文件

gcc  *.c编译当前文件下所有的文件

make :提高编译许多源文件甚至在不同文件下的源文件的效率

makefile  :规定make如何运行,是一种脚本文件,产生脚本语言

                                             脚本:实现批处理

                                          流行的脚本语言:shell,python

makefile三元素:目标,依赖,命令

Make能实现自动编译的原因1. 没有修改过的文件不会再次编译

                          2.按makefile程序来编译

make中先.c--在.o再.o--可执行原因:

.c--可执行:每次更新都要全部编译

.c--.o--可执行:下次更新,只编译更新的,其他的直接只链接原来的编译结果。提高了运行效率。

真目标:可生成的文件

对gdb中的02.c和debug.h程序进行makefile

http://blog.csdn.net/adlics_r/article/details/51863761

  1test :  02.o

  2         cc -o test  02.o

  3 01.o : 02.c debug.h

  4         cc -c 02.c

test和01.o是真目标

伪目标:

.PHONY:clean

clean:

     rm -f *.o cal

阴影部分为伪目标

当makefile用makefile1名字时,则用make  -f  makefile1

可赋值变量:obj1=main.o add.o sub.o mul.o div.o

则  cal_1:$(obj.1)

每个功能下有src (源码) png(图片) doc(文档) lib(库) bin(可执行文件) include(头文件) scripts(脚本文件)

mkdir -p sub/src  sub/png sub/doc sub/lib

Makefile的分类:

1.最顶层的总控makefile :进入各个功能子目录里执行make命令,将所有的.o文件链接生成最终可执行文件

2.功能子目录下的makefile:将src目录下的.c文件编译生成.o文件

3.scripts目录的Makeflie:定义许多变量,提高makefile的维护性和可执行性(相当于C语言的头文件)

先看scripts的makefile,再看总的makefile,再各功能的makefile

 

Makefile两大模型


以下实现加减乘除运算

.

|-- Makefile

|-- add

|   |-- Makefile

|   |-- doc

|   |-- lib

|   |-- png

|   `-- src

|       |-- Makefile

|       `-- add.c

|-- div

|   |-- Makefile

|   |-- doc

|   |-- lib

|   |-- png

|   `-- src

|       `-- div.c

|-- main

|   |-- Makefile

|   |-- doc

|   |-- lib

|   |-- png

|   `-- src

|       `-- main.c

|-- mul

|   |-- Makefile

|   |-- doc

|   |-- lib

|   |-- png

|   `-- src

|       `-- mul.c

|-- scripts

|   `-- Makefile

`-- sub

    |-- Makefile

    |-- doc

    |-- lib

    |-- png

    `-- src

        `-- sub.c

建立如上图所示的文件其中文件如下所示

main/src/main.c

  1 #include <stdio.h>

  2

  3 int main()

  4 {

  5     printf("add = %d\n",add(6,3));

  6     printf("sub = %d\n",sub(6,3));

  7     printf("mul = %d\n",mul(6,3));

  8     printf("div = %d\n",div(6,3));

  9

 10     return 0;

 11 }

add/src/add.c

  1 int add(int a, int b)

  2 {

  3    return a + b;

  4 }

sub/src/sub.c

  1 int sub(int a, int b)

  2 {

  3    return a -b;

  4 }

mul/src/mul.c

  1 int mul(int a, int b)

  2 {

  3    return a * b;

  4 }

div/src/div.c

  1 int div(int a, int b)

  2 {

  3    return a / b;

  4 }

一、使用函数

先编译scripts下的Makefile

scripts/Makefile

  1 CC := gcc

  2 CFLAGS := -Wall -O3#优化开启警告

  3 Libs = -lpthread#加入库函数pthread

  4 Target := client

  5 Source := $(wildcard src/*.c)#列出所有src目录下的所有.c文件

  6 Objs := $(patsubst %.c,%.o,$(Source))#将所有列出的.c文件变成.o文件

  7 Modules += sub add mul div main#将所有文件夹相加同时赋给了Modules这个变量

  8 AllObjs := $(addsuffix /src/*.o,$(Modules))#将Modules文件夹下的src下的.o文件赋给AllObjs

编译总控下的Makefile

Makefile:

  1 include scripts/Makefile

  2

  3 modules_make = $(MAKE) -C $(1);#读取总控Makefile,然后去读取各个目录下的子Makefile文件

  4 modules_clean = $(MAKE) clean -C $(1);

  5

  6 .PHONY: all mm mc clean

  7

  8 all: $(Target)

  9

 10 mm:

 11         @ $(foreach n,$(Modules),$(call modules_make,$(n)))

#将Modules中的值赋给n,执行将n赋给modules_make,即对每个文件夹下执行make

 12 mc:

 13         @ $(foreach n,$(Modules),$(call modules_clean,$(n)))

 14

 15 $(Target) : mm

 16         $(CC) $(CFLAGS) -o $(Target) $(AllObjs) $(Libs)#编译所有.c文件到.o文件

 17         @ echo $(Target) make done!#编译时执行却不显示,打印client make done

 18

 19 clean : mc

 20         rm -rf $(Target)

 21         @ echo clean done!

每个文件下的Makefile

add/Makefile, sub/Makefile,mul/Makefile,div/Makefile,main/Makefile

  1 include ../scripts/Makefile

  2

  3 all : $(Objs)#编译所有.c文件到.o文件

  4

  5 clean :

  6         rm -rf $(Objs)





二、不使用函数

先编译scripts下的Makefile

scripts/Makefile

  1 CC := gcc

  2 CFLAGS := -Wall -O3

  3 Libs = -lpthread

  4 Target := client

  5 Modules += sub add mul div main

  6 AllObjs :=sub/src/*.o add/src/*.o mul/src/*.o div/src/*.o main/src/*.o

编译总控下的Makefile

Makefile:

  1 include scripts/Makefile

  2

  3 .PHONY: all mm mc clean

  4

  5 all: $(Target)

  6

  7 mm:

  8         $(MAKE) -C add

  9         $(MAKE) -C sub

 10         $(MAKE) -C mul

 11         $(MAKE) -C div

 12         $(MAKE) -C main

 13 mc:

 14          $(MAKE) clean -C add

 15          $(MAKE) clean -C sub

 16          $(MAKE) clean -C mul

 17          $(MAKE) clean -C div

 18          $(MAKE) clean -C main

 19

 20

 21 $(Target) : mm

 22         gcc -Wall -O3 -o client add/src/*.o sub/src/*.o mul/src/*.o div/s    rc/*.o main/src/*.o -lpthread

 23             

 24         @ echo $(Target) make done!

 25

 26 clean : mc

 27         rm -rf $(Target)

 28         @ echo clean done!

 

每个文件下的Makefile

add/Makefile,

  1 include ../scripts/Makefile

  2

  3 all :

  4         gcc -c src/add.c -o src/add.o

  5

  6 clean :

  7         rm -rf add.o

  8

 sub/Makefile,

  1 include ../scripts/Makefile

  2

  3 all :

  4         gcc -c src/sub.c -o src/sub.o

  5

  6 clean :

  7         rm -rf sub.o

mul/Makefile,

  1 include ../scripts/Makefile

  2

  3 all :

  4         gcc -c src/mul.c -o src/mul.o

  5

  6

  7 clean :

  8         rm -rf mul.o

  9

div/Makefile,

  1 include ../scripts/Makefile

  2

  3 all :

  4         gcc -c src/div.c -o src/div.o

  5

  6 clean :

  7         rm -rf div.o

main/Makefile

  1 include ../scripts/Makefile

  2

  3 all :

  4         gcc -c src/main.c -o src/main.o

  5 clean :

  6         rm -rf main.o

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值