Chinaunix首页 | 论坛 | 博客
  • 博客访问: 398922
  • 博文数量: 75
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 645
  • 用 户 组: 普通用户
  • 注册时间: 2015-06-03 18:24
文章分类

全部博文(75)

文章存档

2019年(1)

2018年(20)

2017年(14)

2016年(10)

2015年(30)

分类: 嵌入式

2015-06-26 22:16:54

        新人到此,一开始都知道该说些什么。毕竟是第一次写博客!还是不说那么多废话了。开始进入主题了!

       在学校只是写那些很短的代码,可能基本都不会用的上makefile,但是在一个大型的project中就很好的发挥出它的强大作用!所以学会写多目录,多文件下的makefile就是你走上大型工程代码的第一步!


下面以我自己写的一个很小的工程代码为例!带你进入多目录、多文件下的makefile的编写:
1、首先我们需要创建一个test目录,然后在test目录下创建5个目录,分别为inc、lib、main、obj、src。和一个Makefile文件。
        下面就主要介绍下这四个文件的主要存放的文件和作用
    --inc:inc目录就是include的缩写,主要存放在一些头文件。
    --lib: lib目录就是library的缩写,主要就是存放一些库文件。比如.a、.so等静态库和动态库文件。
    --main:   该目录就是存放main函数的文件,程序的入口就是从该目录下的main函数下开始的。
    --obj:obj目录就是object的缩写,主要存放的就是目标文件,一些可重定向文件,如.o等文件。
    --src:src目录就是source的缩写,就是存放一些源文件,main函数主要调用src目录下的一个函数。
    Makefile:主makefile文件,该makefile主要定义一些目录的路径然后跳到指定目录下的makefile中执行相应子目录下的makefile。

2、在main目录下有一个main.c文件和Makefile文件,二话不说,直接上代码吧!
main.c的代码

点击(此处)折叠或打开

  1. #include<stdio.h>
  2. #include "test.h"
  3. int main(void)
  4. {
  5.     test1();
  6.     test2();

  7.     return 0;
  8. }
main目录下的子Makefile

点击(此处)折叠或打开

  1. $(OBJ_DIR)/main.o:main.c
  2.     $(CC) -c $^ -o $@ $(CFLAG)
3、src目录下有三个文件,test1.c、test2.c、Makefile
test1.c

点击(此处)折叠或打开

  1. #include "test.h"

  2. void test1()
  3. {
  4.     printf("test1\n");

  5.     return;
  6. }
test2.c

点击(此处)折叠或打开

  1. #include "test.h"

  2. void test2()
  3. {
  4.     printf("test2\n");

  5.     return;
  6. }
src目录下的子Makefile:

点击(此处)折叠或打开

  1. .PHONY:all

  2. all:$(OBJ_DIR)/test1.o $(OBJ_DIR)/test2.o

  3. $(OBJ_DIR)/test1.o:test1.c
  4.     $(CC) -c $^ -o $@ $(CFLAG)

  5. $(OBJ_DIR)/test2.o:test2.c
  6.     $(CC) -c $^ -o $@ $(CFLAG)
4、obj目录下就只有一个Makefile文件

点击(此处)折叠或打开

  1. OBJ=$(wildcard *.o)

  2. $(PWD_DIR)/app:$(OBJ)
  3.     $(CC) -o $@ $^
5、inc目录下也只有一个文件test.h

点击(此处)折叠或打开

  1. #ifndef _TEST_H
  2. #define _TEST_H

  3. #include<stdio.h>

  4. void test1();
  5. void test2();

  6. #endif
6、主目录下的Makefile

点击(此处)折叠或打开

  1. .PHONY:all clean

  2. ##
  3. PWD_DIR=$(shell pwd)
  4. SRC_DIR=$(PWD_DIR)/src
  5. OBJ_DIR=$(PWD_DIR)/obj
  6. MAIN_DIR=$(PWD_DIR)/main
  7. LIB_DIR=$(PWD_DIR)/lib
  8. INC_DIR=$(PWD_DIR)/inc

  9. ##
  10. CC=gcc
  11. CFLAG=-Wall -g -I$(INC_DIR)

  12. ##
  13. export PWD_DIR SRC_DIR OBJ_DIR MAIN_DIR LIB_DIR INC_DIR CC CFLAG

  14. ##
  15. all:
  16.     make -C $(SRC_DIR)
  17.     make -C $(MAIN_DIR)
  18.     make -C $(OBJ_DIR)

  19. ##
  20. clean:
  21.     $(RM) -rf $(OBJ_DIR)/*.o
  22.     $(RM) app

------------------------------------------------------------------------------------------------------------------------
    到现在为止,已经把所以的代码都呈现出来了!现在就来说说makefile的总体执行流程!

首先进入test目录下,看下主目录下的Makefile。如果你以前从来没有学过Makefile,也许你会觉得这是乱码!怎么会有这样一堆的东西呢?但是只要你细心去看,还是能找到规律的。
##
PWD_DIR=$(shell pwd)
SRC_DIR=$(PWD_DIR)/src
OBJ_DIR=$(PWD_DIR)/obj
MAIN_DIR=$(PWD_DIR)/main
LIB_DIR=$(PWD_DIR)/lib
INC_DIR=$(PWD_DIR)/inc
这些就是获取当前目录和其他子目录的路径,然后通过
##
export PWD_DIR SRC_DIR OBJ_DIR MAIN_DIR LIB_DIR INC_DIR CC CFLAG
这条语句把所以的目录路径导出,给子Makefile使用。

##
all:
    make -C $(SRC_DIR)
    make -C $(MAIN_DIR)
    make -C $(OBJ_DIR)
make -C 目录   -------》  这就代表执行指定目录下的makefile
所以这几条语句就是依次执行以下几个目录下的makefile

##
clean:
    $(RM) -rf $(OBJ_DIR)/*.o
    $(RM) app
这几条语句删除编译生成的目标文件和可执行文件app

--------------------------------------------------------------------------------------------------------------------
main目录下Makefile
$(OBJ_DIR)/main.o:main.c
    $(CC) -c $^ -o $@ $(CFLAG)
将main.c文件编译成main.o放在obj目录下

-------------------------------------------------------------------------------------------------------------------
src目录下的Makefile
.PHONY:all

all:$(OBJ_DIR)/test1.o $(OBJ_DIR)/test2.o

$(OBJ_DIR)/test1.o:test1.c
    $(CC) -c $^ -o $@ $(CFLAG)

$(OBJ_DIR)/test2.o:test2.c
    $(CC) -c $^ -o $@ $(CFLAG)
这里的意思是将test1.c和test2.c编译成目标文件存放在obj文件。

---------------------------------------------------------------------------------------------------------
下面来看下obj目录下的Makefile文件了
OBJ=$(wildcard *.o)

$(PWD_DIR)/app:$(OBJ)
    $(CC) -o $@ $^

将所以的目标文件编译成可执行文件app

-----------------------------------------------------------------------------------------------------------

说到这里就差不多把所以的说完了!感觉把自己都说晕了!当成是做笔记了!印象深刻点!


















        




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