Chinaunix首页 | 论坛 | 博客
  • 博客访问: 554471
  • 博文数量: 66
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1810
  • 用 户 组: 普通用户
  • 注册时间: 2013-07-23 13:53
个人简介

linux

文章分类

全部博文(66)

文章存档

2016年(1)

2015年(14)

2014年(32)

2013年(19)

分类: LINUX

2013-09-08 16:34:42

make和makefile
    make:一个项目管理的工具
常用的执行方式:
    1.make
    2.make target
    上面两种形式默认会在当前目录下查找名为:makefile或Makefile第二种形式,make特定的目标
    3.make -f file
    4.make -f file target

makefile规则:
    makefile的内容:
    makefile由一系列的规则组成,而规则可以简单的认为是由 目标、依赖、命令组成。形式如下:
    #规则
    target....:prerequesites....
    command #命令之前必须以一个tab开头
    #例如:
    hello : hello.o   #target:hello 依赖:hello.o
    g++ -o hello hello.o     #命令
简单的makefile目录结构:

简单的makefile:
  1. #Makefile v01

  2. all:../bin/make_test
  3. ../bin/make_test : ./main.o ./sub1/dummy1.o \
  4.         ./sub1/dummy2.o ./sub2/dummy3.o \
  5.         ./sub2/dummy4.o
  6.         g++ -o ../bin/make_test ./main.o ./sub1/dummy1.o \
  7.                 ./sub1/dummy2.o ./sub2/dummy3.o \
  8.                 ./sub2/dummy4.o

  9. ./main.o: ../src/main.cpp
  10.         g++ -o ./main.o -c ../src/main.cpp -I ../inc

  11. ./sub1/dummy1.o: ../src/sub1/dummy1.cpp
  12.         g++ -o ./sub1/dummy1.o -c ../src/sub1/dummy1.cpp -I ../inc


  13. ./sub1/dummy2.o: ../src/sub1/dummy2.cpp
  14.         g++ -o ./sub1/dummy2.o -c ../src/sub1/dummy2.cpp -I ../inc


  15. ./sub2/dummy3.o: ../src/sub2/dummy3.cpp
  16.         g++ -o ./sub2/dummy3.o -c ../src/sub2/dummy3.cpp -I ../inc


  17. ./sub2/dummy4.o: ../src/sub2/dummy4.cpp
  18.         g++ -o ./sub2/dummy4.o -c ../src/sub2/dummy4.cpp -I ../inc

  19. clean:
  20.         rm -rf ../bin/make_test main.o sub1/* sub2/*
使用变量:
使用变量可以使makefile更容易管理
Makefile的变量规则:
variable = value 或 variable := value
注意:上面的两个变量的复制有区别:
前者追随变量的改变,后者则不追随变量的改变
变量值可以通过追加而改变,如:
OBJS += ../src/sub2/dummy3.o \
../src/sub2/dummy4.o
上面语句表示,变量OBJS(可能)在别处定义并已赋值,这里仅追加一些内容

使用变量改造Makefile:
  1. #Makefile v02

  2. RM := rm -rf

  3. OBJS = ./main.o ./sub1/dummy1.o \
  4.         ./sub1/dummy2.o ./sub2/dummy3.o \
  5.         ./sub2/dummy4.o

  6. all:../bin/make_test

  7. ../bin/make_test : $(OBJS)
  8.         g++ -o ../bin/make_test $(OBJS)

  9. ./main.o: ../src/main.cpp
  10.         g++ -o ./main.o -c ../src/main.cpp -I ../inc

  11. ./sub1/dummy1.o: ../src/sub1/dummy1.cpp
  12.         g++ -o ./sub1/dummy1.o -c ../src/sub1/dummy1.cpp -I ../inc


  13. ./sub1/dummy2.o: ../src/sub1/dummy2.cpp
  14.         g++ -o ./sub1/dummy2.o -c ../src/sub1/dummy2.cpp -I ../inc


  15. ./sub2/dummy3.o: ../src/sub2/dummy3.cpp
  16.         g++ -o ./sub2/dummy3.o -c ../src/sub2/dummy3.cpp -I ../inc


  17. ./sub2/dummy4.o: ../src/sub2/dummy4.cpp
  18.         g++ -o ./sub2/dummy4.o -c ../src/sub2/dummy4.cpp -I ../inc

  19. clean:
  20.         $(RM) ../bin/make_test main.o sub1/* sub2/*
常用的自动变量:
                            变量说明
$@                       指代规则中所有目标文件,如:main.o : main.cpp ($@ 指代main.o)
$%                       当目标文件是静态库(.a文件)时,指代目标文件的成员。例如,如果一个目标是"foo.a(bar.o)", 
                            那么,"$%"就是"bar.o","$@"就是"foo.a"。如果目标不是静态库文件,那么,其值为空
$<                        指代第一个依赖文件名
$?                         指代所有比目标文件新的依赖文件
$^                        指代所有依赖文件名,中间由空格分隔
$+                        类似"$^",也是指代所有依赖文件。但改该变量不去除重复的依赖文件

常用的自动变量Makefile:

  1. #Makefile v03

  2. RM := rm -rf
  3. INC := ../inc
  4. OBJS = ./main.o ./sub1/dummy1.o \
  5.         ./sub1/dummy2.o ./sub2/dummy3.o \
  6.         ./sub2/dummy4.o

  7. all:../bin/make_test

  8. ../bin/make_test : $(OBJS)
  9.         g++ -o $(@) $(^)

  10. ./main.o: ../src/main.cpp
  11.         g++ -o $(@) -c $(<) -I$(INC)

  12. ./sub1/dummy1.o: ../src/sub1/dummy1.cpp
  13.         g++ -o $(@) -c $(<) -I$(INC)

  14. ./sub1/dummy2.o: ../src/sub1/dummy2.cpp
  15.         g++ -o $(@) -c $(<) -I$(INC)

  16. ./sub2/dummy3.o: ../src/sub2/dummy3.cpp
  17.         g++ -o $(@) -c $(<) -I$(INC)

  18. ./sub2/dummy4.o: ../src/sub2/dummy4.cpp
  19.         g++ -o $(@) -c $(<) -I$(INC)

  20. clean:
  21.         $(RM) $(OBjS) ../bin/*
使用%.o:%c样式:
    %的通配符规则简单描述为:置换文件名中除了前缀和后缀之外的主干部分
        %.o:%c样式示例说明:
        如当前目录下有:a.cpp, b.cpp则:
        %.o:%.cpp
            command ...
        # 上面一条规则等价于下面几条规则:
            a.o : a.cpp
            command ...
            b.o : b.cpp
            command ...
使用%o:%c样式的makefile:

  1. #Makefile v04

  2. RM := rm -rf
  3. INC := ../inc
  4. OBJS = ./main.o ./sub1/dummy1.o \
  5.         ./sub1/dummy2.o ./sub2/dummy3.o \
  6.         ./sub2/dummy4.o

  7. all:../bin/make_test

  8. ../bin/make_test : $(OBJS)
  9.         g++ -o $(@) $(^)

  10. ./%.o: ../src/%.cpp
  11.         g++ -o $(@) -c $(<) -I$(INC)

  12. ./sub1/%.o: ../src/sub1/%.cpp
  13.         g++ -o $(@) -c $(<) -I$(INC)

  14. ./sub2/%.o: ../src/sub2/%`.cpp
  15.         g++ -o $(@) -c $(<) -I$(INC)

  16. clean:
  17.         $(RM) $(OBjS) ../bin/*

Makefile 模块化
? 从这次的项目目录结构看,我们可以按源文件的目录结构将项目划分成3个部分:./src,./src/sub1 ,./src/sub2
? 根据上述划分,我们可以将Makefile 分为4个文件:
    ● ./build/Makefile :主makefile ,负责完成最后的工作,如链接,产生最终目标文件
    ● ./build/sub.mk :负责生成./src 下的目标文件(.o 文件)
    ● ./build/sub1/sub.mk :负责生成./src/sub1 下的目标文件
    ● ./build/sub2/sub.mk :负责生成./src/sub2 下的目

    Makefile 模块化 改进后的Makefile
    
  1. #Makefile v05

  2.     RM := rm -rf
  3.     include ./sub.mk
  4.     include ./sub1/sub.mk
  5.     include ./sub2/sub.mk

  6.     all : ../bin/make_test

  7.     ../bin/make_test : $(OBJS)
  8.         g++ -o $(@) $(^)
  9.     .PHONY : clean
  10.     clean:
  11.         $(RM) $(OBJS) ../bin/*

  12.     Makefile 模块化 划分的子makefile
  13.     #./sub.mk
  14.     #Makefile v05

  15.     OBJS += \
  16.     ./main.o

  17.     ./%.o: ../src/%.cpp
  18.         g++ -o $(@) -c $(<) -I"../inc"

  19.     #./sub1/sub.mk
  20.     #Makefile v05

  21.     OBJS += \
  22.     ./sub1/dummy1.o \
  23.     ./sub1/dummy2.o


  24.     ./sub1/%.o: ../src/sub1/%.cpp
  25.         g++ -o $(@) -c $(<) -I"../inc"

  26.     
  27.     #./sub2/sub.mk
  28.     #Makefile v05

  29.     OBJS += \
  30.     ./sub2/dummy3.o \
  31.     ./sub2/dummy4.o

  32.     ./sub2/%.o: ../src/sub2/%.cpp
  33.         g++ -o $(@) -c $(<) -I"../inc"


阅读(960) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~