[Makefile]多目录Makefile写法

最近需要写一个测试程序,这个测试程序需要集成一些功能,写在同一个文件看上去很不好,多个文件的Makefile又不是很熟,于是分享下面这篇文章

转自:http://blog.csdn.net/yuzhihui_no1/article/details/44810357

前面已经分享了单目录项下多文件的makefile的编写,现在来看看多目录下多文件makefile的编写;

在做项目时,一般文件都会分几个目录来存放;基本的是  include/  bin/ src/ obj/ lib/ tools/,这几个文件;我先说下我的文件存放目录,用ls -R可以查看到所有文件:./include/common.h    ./src/main.c    ./src/printStatus.c  就三个文件,其中*.c 文件都依赖于 *.h文件;

同样的先上第一版makefile:

[cpp] view plain copy

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

上面的makefile就是gcc命令的拼凑起来的,下面来分享下比较通用的多目录下的makefile;

在看多目录的makefile时,先来理解下几个函数和变量;

函数:

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

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

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

变量:

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

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

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

第二版makefile

[cpp] view plain copy

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

这个makefile的好处就是通用性,里面不涉及到具体的文件名,当你往src目录中添加新文件时,可以不需要修改makefile,所以这是个非常好的工具;

转载请注明作者和原文出处,原文地址:http://blog.csdn.net/yuzhihui_no1/article/details/44810357

若有不正确之处,望大家指正,共同学习!谢谢!!!

前面已经分享了单目录项下多文件的makefile的编写,现在来看看多目录下多文件makefile的编写;

在做项目时,一般文件都会分几个目录来存放;基本的是  include/  bin/ src/ obj/ lib/ tools/,这几个文件;我先说下我的文件存放目录,用ls -R可以查看到所有文件:./include/common.h    ./src/main.c    ./src/printStatus.c  就三个文件,其中*.c 文件都依赖于 *.h文件;

同样的先上第一版makefile:

[cpp] view plain copy

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

上面的makefile就是gcc命令的拼凑起来的,下面来分享下比较通用的多目录下的makefile;

在看多目录的makefile时,先来理解下几个函数和变量;

函数:

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

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

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

变量:

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

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

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

第二版makefile

[cpp] view plain copy

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

这个makefile的好处就是通用性,里面不涉及到具体的文件名,当你往src目录中添加新文件时,可以不需要修改makefile,所以这是个非常好的工具;

转载请注明作者和原文出处,原文地址:http://blog.csdn.net/yuzhihui_no1/article/details/44810357

若有不正确之处,望大家指正,共同学习!谢谢!!!

时间: 2024-08-04 23:27:25

[Makefile]多目录Makefile写法的相关文章

Makefile 多目录自动编译

适用于多目录结构 C 工程自动编译. makefile 分成三类: 1. 工程根目录 makefile  : 这个makefile执行分成两个阶段 a)递归进入每个子目录, 逐个执行子目录里面的 makefile ,将所有子目录里面生成的  .o 文件统一放在 /debug/obj (debug 子目录比较特殊 在第一阶段需要将这个子目录排除在外) b)执行 debug 子目录下面的 makefile 将第一阶段生成在 /debug/obj 里面的 .o 文件连接成可执行文件 2. 子目录 ma

Linux Makefile多目录的编写

手头一个项目,需要编写项目的makefile 多目录结构: csource/ ├── common│   └── sqlite3├── inc│   ├── curl│   ├── lua│   └── Protection├── lib│   ├── arm│   └── linux├── obj├── out│   ├── arm│   └── linux├── src 源码目录src,输出目录out,include目录inc,输入链接库目录lib,常用静态函数和sqlite3目录commo

makefile.in与makefile.am

Q1: makefile.am 与 makefile.in是什么文件,干嘛用? 它对编译程序有用吗/ -------------------------------------------------- A1: 避免重复编译,减少等待时间之用. A2: make install 时用 A3: automake 读取 Makefile.am 来产生 Makefile.in, configure 读取 Makefile.in 来产生 Makefile configure 脚本通常由 autoconf

通用多目录makefile的写法

我的项目文件层次是:项目名称/include.output.src src/admin.stu.tch.common 最外层的Makefile: DEBUG = yMYDEBUG = DEBUGifeq ($(DEBUG),y)DEBFLAGS = -O -g -D$(MYDEBUG)elseDEBFLAGS =endif PRJ_HOME := $(shell pwd)SOURCES := $(wildcard *.c)OBJECTS := ${SOURCES:%.c=%.o}INCPATH

makefile的几种写法【原创】

Makefile  编写 Make  -f  makefile1 指定 如下是 本人的一点makefile学习笔记,再分享一个不错的写makefile总结的网址: http://www.cnblogs.com/wang_yb/p/3990952.html 方式一. 同一个目录下有多个.c .h文件 CROSS_COMPILE=arm-none-linux-gnueabi-gcc #CC=arm-none-linux-gnueabi-gcc TEST_RES := regDebug objects

redis源码分析(1)--makefile和目录结构分析

一.redis源码编译 redis可以直接在官网下载(本文使用版本 3.0.7):https://redis.io/download 安装: $ tar xzf redis-3.0.7.tar.gz $ cd redis-3.0.7 $ make make执行以后主要编译产物在src/redis-server src/redis-cli 如果想把redis-server直接install到可执行目录/usr/local/bin,还需要执行: $ make install Run Redis wi

android编译系统的makefile文件Android.mk写法如下

(1)Android.mk文件首先需要指定LOCAL_PATH变量,用于查找源文件.由于一般情况下 Android.mk和需要编译的源文件在同一目录下,所以定义成如下形式:LOCAL_PATH:=$(call my-dir)上面的语句的意思是将LOCAL_PATH变量定义成本文件所在目录路径. (2)Android.mk中可以定义多个编译模块,每个编译模块都是以include $(CLEAR_VARS)开始以include $(BUILD_XXX)结束.include $(CLEAR_VARS)

Makefile使用,Makefile的优化全过程

以一组简单的.c文件为例.从编译命令到Makefile的学习过程. gcc参数不做过多叙述,如下这几个文件及内容: add.c int add(int a int b) { return a+b; } sub.c int sub(int a ,int b) { return a-b; } cal.h #ifndef __CAL_H_ #define __CAL_H_ int add(int,int); int sub(int,int); #endif main.c #include <stdio

通用 Makefile(及makefile中的notdir,wildcard和patsubst)

notdir,wildcard和patsubst是makefile中几个有用的函数,以前没留意过makefile中函数的用法,今天稍微看看~ 1.makefile里的函数 makefile里的函数使用,和取变量的值类似,是以一个'$'开始,然后是一个括号里面是函数名和需要的参数列表,多个变量用逗号隔开,像这样 return = $(functionname  arg1,arg2,arg3...). 可能这里的'$'更像是从某个地址取值类似的操作. 2. wildcard 使用:SRC = $(w