博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
makefile文件的两种常用书写格式(搜索路径式+递归式)
阅读量:7102 次
发布时间:2019-06-28

本文共 2780 字,大约阅读时间需要 9 分钟。

  首先,写一个测试代码,很简单的加减程序:

//path: cacu/main.c
//path: cacu/main.c#include 
#include "add.h"#include "sub.h"int main(){ int a=10,b=12; float x=1.23456,y=9.87654; printf("int a+b IS:%d\n",add_int(a,b)); printf("int a-b IS:%d\n",sub_int(a,b)); printf("float x+y IS:%f\n",add_float(x,y)); printf("float x-y IS:%f\n",sub_float(x,y)); return 0;}
//path: cacu/sub/sub.h
//path: cacu/sub/sub.h#ifndef SUB_H#define SUB_Hextern float sub_float(float a, float b);extern int sub_int(int a, int b);#endif
//path: cacu/sub/sub_float.c
float sub_float(float a, float b){    return a-b;}
//path: cacu/sub/sub_int.c
//path: cacu/sub/sub_int.cint sub_int(int a, int b){    return a-b;}
//path: cacu/add/add.h
//path: cacu/add/add.h#ifndef ADD_H#define ADD_Hextern int add_int(int a, int b);extern float add_float(float a, float b);#endif
//path: cacu/add/add_float.c
//path: cacu/add/add_float.cfloat add_float(float a, float b){    return a+b;}
//path: cacu/add/add_int.c
//path: cacu/add/add_int.cint add_int(int a, int b){    return a+b;}

  接下来看看怎么写makefile文件。

第一种:搜索路径式

  该方法使用了VPATH变量,VPATH的格式如下:

    VPATH=path1:path2:...

  VPATH等号右边的路径名以冒号(:)分割,如

VPATH = add:sub:.

  使用该方法实现前面给出的例子的makefile文件如下:

CFLAGS = -Iadd -Isub -O2OBJSDIR = .objsVPATH = add:sub:.OBJS = add_int.o add_float.o sub_int.o sub_float.o main.oTARGET = cacu $(OBJSDIR):    mkdir -p ./$@$(TARGET):$(OBJSDIR) $(OBJS)    $(CC) -o $(TARGET) $(OBJSDIR)/*.o $(CFLAGS)$(OBJS):%.o:%.c    $(CC) -c $(CFLAGS) $< -o $(OBJSDIR)/$@clean:    -$(RM) $(TARGET)    -$(RM) $(OBJSDIR)/*.o

  makdir命令的那一行是建立一个.bojs文件。

  $(OBJS):%.o:%.c      $(CC) -c $(CFLAGS) $< -o $(OBJSDIR)/$@

  这里也使用了搜索路径。

  其他的$<,$@等介绍请参考:,百度文库把基本用法已经写的很清楚了。

 

第二种:递归式

  为了实现每个目录下的代码具有独立的makefile,且根目录下的makefile可以一次执行子目录下的makefile,就有了递归式的方法来写父目录下的makefile了,该方法的实现是使用的$(MAKE)变量,使用格式如下:

add:       cd add &&  $(MAKE)

  也可以这样写:

add:           $(MAKE)  -C add

  这样就可以递归调用子目录add下面make命令来执行add目录下的makefile文件,我们先把add和sub两个子目录下的makefile文件写好来,如下:

OBJS = add_int.o add_float.oCFLAGS = -O2all:$(OBJS)$(OBJS):%.o:%.c    $(CC) -c $< -o $(OBJSDIR)/$@ $(CFLAGS)clean:    $(RM) $(OBJS)
OBJS = sub_int.o sub_float.oCFLAGS=-O2all:$(OBJS)$(OBJS):%.o:%.c    $(CC) -c $< -o $(OBJSDIR)/$@ $(CFLAGS)clean:    $(RM) $(OBJS)

  接下来就是写主目录cacu下面的makefile文件了,使用前面递归调用格式,makefile文件如下:

CC = gccCFLAGS = -O2TARGET = cacuexport OBJSDIR = ${shell pwd}/.objs$(TARGET):$(OBJSDIR) main.o    $(MAKE) -C add    $(MAKE) -C sub    $(CC) -o $(TARGET) $(OBJSDIR)/*.omain.o:%.o:%.c    $(CC) -c $< -o $(OBJSDIR)/$@ $(CFLAGS) -Iadd -Isub$(OBJSDIR):    mkdir -p $(OBJSDIR)clean:    -$(RM) $(TARGET)    -$(RM) $(OBJSDIR)/*.o
  “$(MAKE) -C add” “$(MAKE) -C sub”这两句实现的就是在执行下面的命令前先执行子目录下的makefile文件。 测试结果:   搜索路径式的测试结果:

递归式的测试结果:

  这个不算我原创的,借用了书上的,算是学习笔记吧。参考书《Linux网络编程》-宋敬彬,孙海滨。 我就菜鸟一个,欢迎拍砖

转载地址:http://mtkhl.baihongyu.com/

你可能感兴趣的文章
网络学习笔记:TCP/IP连网和Internet
查看>>
栈实现迷宫问题
查看>>
POJ2724 Purifying Machine(二分图)
查看>>
c++模板实现 linq
查看>>
spring security基本知识(三) 过滤详细说明
查看>>
python with语句上下文管理的两种实现方法
查看>>
谭永基来JNU Zhuhai开讲座了。
查看>>
HashMap和Hashtable的区别
查看>>
CCF NOI1067 最匹配的矩阵
查看>>
POJ3048 HDU2710 Max Factor
查看>>
KMP算法(C语言版)
查看>>
HDU 5726 GCD 求给定序列中与查询段相等的GCD个数
查看>>
docker基础总结
查看>>
Kafka~消费的有效期
查看>>
openSUSE Linux常用命令行记录
查看>>
JavaScript中如何判断两变量是否“相等”?
查看>>
算法练习(四)
查看>>
java类读取properties文件
查看>>
单源最短路径的Bellman-Ford 算法
查看>>
enable parallel unit test running in visual studio 2010
查看>>