多个文件目录下Makefile的写法

多个文件目录下Makefile的写法

1、前言

  目前从事于linux下程序开发,涉及到多个文件,多个目录,这时候编译文件的任务量比较大,需要写Makefile。关于Makefile的详细内容可以参考网上流传非常广泛的《跟我一起写Makefile》http://blog.csdn.net/haoel/article/details/2886/,作者是个大牛,非常佩服。

2、简单测试

  测试程序在同一个文件中,共有func.h、func.c、main.c三个文件,Makefile写法如下所示:

  1. CC=gcc  
  2. objects=obj/main.o obj/printStatus.o  
  3.   
  4. bin/main:$(objects)  
  5.    $(CC) -o bin/main $(objects)  
  6.   
  7. obj/main.o:src/main.c include/common.h  
  8.    $(CC) -o obj/main.o -c src/main.c -Iinclude  
  9.   
  10. obj/printStatus.o:src/printStatus.c include/common.h  
  11.    $(CC) -o obj/printStatus.o -c src/printStatus.c -Iinclude  
  12.   
  13. clean:  
  14.    rm -rf $(objects) bin/main 

执行过程如下图所示:

3、通用模板

  实际当中程序文件比较大,这时候对文件进行分类,分为头文件、源文件、目标文件、可执行文件。也就是说通常将文件按照文件类型放在不同的目录当中,这个时候的Makefile需要统一管理这些文件,将生产的目标文件放在目标目录下,可执行文件放到可执行目录下。测试程序如下图所示:

完整的Makefile如下所示:


  1. #把所有的目录做成变量,方便修改和移植   
  2. BIN = ./bin  
  3.  SRC = ./src  
  4.  INC = ./include  
  5.  OBJ = ./obj  
  6.    
  7. #提前所有源文件(即:*.c文件)和所有中间文件(即:*.o)  
  8.  SOURCE = $(wildcard ${SRC}/*.c)  
  9.  OBJECT = $(patsubst %.c,${OBJ}/%.o,$(notdir ${SOURCE}))  
  10.    
  11. #设置最后目标文件  
  12.  TARGET = main  
  13.  BIN_TARGET = ${BIN}/${TARGET}  
  14.    
  15.  CC = gcc   
  16.  CFLAGS = -g -Wall -I${INC}   
  17.    
  18. #用所有中间文件生成目的文件,规则中可以用 $^替换掉 ${OBJECT}  
  19.  ${BIN_TARGET}:${OBJECT}  
  20.      $(CC) -o $@ ${OBJECT}  
  21.    
  22. #生成各个中间文件  
  23.  ${OBJ}/%.o:${SRC}/%.c   
  24.      $(CC) $(CFLAGS) -o $@ -c $<  
  25.    
  26.  .PHONY:clean  
  27.  clean:  
  28.      find $(OBJ) -name *.o -exec rm -rf {} \; #这个是find命令,不懂的可以查下资料  
  29.      rm -rf $(BIN_TARGET) 
在看多目录的makefile时,先来理解下几个函数和变量;

(1)Makefile中的 符号 $@, $^, $< 的意思:
  $@  表示目标文件
  $^  表示所有的依赖文件
  $<  表示第一个依赖文件
  $?  表示比目标还要新的依赖文件列表

(2)wildcard、notdir、patsubst的意思:

  wildcard : 扩展通配符
  notdir : 去除路径
  patsubst :替换通配符

解释如下:

函数:

        wildcard 这是扩展通配符函数,功能是展开成一列所有符合由其参数描述的文 件名,文件间以空格间隔;比如:罗列出src下的所有.c文件:$(wildcard ${SRC}/*.c)

        patsubst 这是匹配替换函数, patsubst ( 需要匹配的文件样式,匹配替换成什么文件,需要匹配的源文件)函数。比如:用src下的*.c替换成对应的 *.o文件存放到obj中:$(patsubst  %.c, ${OBJ}/%.o, $(notdir $(SOURCE)))

        notdir 这是去除路径函数,在上面patsubst函数中已经使用过,去除SOURCE中文件的所有目录,只留下文件名;


变量:

        $@:表示目标文件;一般是在规则中这么用:gcc  -o $@  $(object);

        $^:表示所有依赖文件;一般是在规则中这么用:gcc -o $@  $^  ;用所有依赖文件链接成目的文件;

        $<:表示第一个依赖文件;在规则中使用:gcc -o $@ -c $< ;其实这个时候就是每个依赖文件生成一个目的文件;


 例如下图例子所示:

输出结果如下所示:

SRC = $(wildcard *.c)

等于指定编译当前目录下所有.c文件,如果还有子目录,比如子目录为inc,则再增加一个wildcard函数,象这样:

SRC = $(wildcard *.c) $(wildcard inc/*.c)

(3)gcc -I -L -l的区别:

       gcc -o hello hello.c -I /home/hello/include -L /home/hello/lib -lworld

       上面这句表示在编译hello.c时-I /home/hello/include表示将/home/hello/include目录作为第一个寻找头文件的目录,

   寻找的顺序是:/home/hello/include-->/usr/include-->/usr/local/include

   -L /home/hello/lib表示将/home/hello/lib目录作为第一个寻找库文件的目录,

   寻找的顺序是:/home/hello/lib-->/lib-->/usr/lib-->/usr/local/lib

       -lworld表示在上面的lib的路径中寻找libworld.so动态库文件(如果gcc编译选项中加入了“-static”表示寻找libworld.a静态库文件)


转载:http://www.cnblogs.com/Anker/p/3242207.html

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
makefile是一种用于自动化构建和编译程序的脚本文件makefile的基本写法包括目标、依赖、规则和命令这三个要素。 1. 目标:目标是指需要生成的文件或执行的任务。在makefile中,目标通常是一个可执行文件或一个文件的对象文件。可以有多个目标,每个目标占据一行,并以冒号(:)结尾。 2. 依赖:依赖是指目标生成所依赖的文件或任务。在makefile中,依赖通常是源文件或其他目标。依赖也可以有多个,每个依赖之间用空格分隔,放在目标的后面。 3. 规则:规则是指定义了目标和依赖之间关系的部分。在makefile中,规则以目标为开头,后面是一个冒号(:),然后是依赖。规则可以有多行,每行以一个Tab键开头,表示规则所对应的命令。 例如,下面是一个简单的makefile示例: ``` target: dependency command ``` 其中,`target`是目标,`dependency`是依赖,`command`是需要执行的命令。 通过这样的规则,当依赖发生变化时,可以使用make命令来自动更新目标。make工具会自动识别目标和依赖之间的关系,并执行相应的命令来生成目标。 需要注意的是,makefile中的命令必须以Tab键开头,否则make工具无法正确解析。 这只是makefile的一种简单写法,实际上,makefile可以包含更复杂的规则和命令,以满足具体项目的需求。可以通过学习更多的makefile语法和使用方法来进一步掌握makefile写法。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [手把手教你写makefile](https://blog.csdn.net/weixin_43574962/article/details/104108641)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值