学习makefile的一个工程示例

来源:互联网 发布:软件平台下载 编辑:程序博客网 时间:2024/05/20 03:38

http://www.cnblogs.com/pcxie/p/8000170.html

前言

makefile推荐资料为陈皓的跟我一起写makefile,需要pdf资源的可以私我

正文

基础知识

g++ [-I文件夹1:文件夹2]  文件a 

表示的是在编译文件a时,其头文件除了系统默认的位置,还要查询文件夹1和文件夹2下有没有对应的文件

makefile中的基本文法为以下加粗部分:

目标1 目标2 目标3... : 依赖1 依赖2 依赖3... 

  命令1

  命令2

  命令3...

其中

$^代表所有的依赖对象

$<代表第一个依赖对象

$@ 代表所有目标

工程目录结构

---include(放置头文件.h)

------student.h(Student类的头文件)

---src(放置源文件.cc)

------student.cc(Student类的定义文件)

------main.cc(main文件)

------makefile(子makefile,将.cc编译为.o)

---obj(放置编译临时文件.o)

------makefile(子makefile,将.o链接为可执行文件)

---bin(放置生成的可执行文件)

---makefile(主makefile,调用子makefile进行项目构建)

文件介绍

student.h和student.cc完成一个类,main函数中创建student类,其中main.cc和student.cc头文件包含了student.h
主makefile(主makefile,调用子makefile进行项目构建)

复制代码
 1 CC = g++  #因为是C++代码,定义编译方式为g++ 2 TOP_DIR := ${PWD} #定义当前makefile文件位置 3 SUB_DIR := src obj  #工程中含有makefile,需要进行make的文件夹 4 BIN := hello  #定义最终生成可执行文件的名称 5 BIN_DIR := ${TOP_DIR}/bin  #定义最终生成可执行文件的放置位置 6 OBJ = main.o student.o  #定义中间需要生成的中间文件 7 OBJ_DIR := $(TOP_DIR)/obj  #定义中间文件需要放置的文件夹 8 INCLUDE := ${TOP_DIR}/include  #定义头文件放置位置 9 SRC := ${TOP_DIR}/src  #定义源文件放置的位置10 VPATH := ${INCLUDE}:${SRC}  #定义头文件及源文件查找的位置,不设置会导致在编译时找不到头文件或者源文件11 export CC :TOP_DIR OBJ OBJ_DIR BIN_DIR BIN INCLUDE SRC VPATH  #将以上变量导出为全局变量,这样在子makefile也能能够直接使用12 13 all: CHECKDIR $(SUB_DIR)  #当执行make命令时,首先要执行all这段,其依赖于CHECKDIR和${SUB_DIR}的构建14 CHECKDIR:            15     mkdir -p $(SUB_DIR) $(BIN_DIR)  #构建执行中所需要的文件夹,包括src obj(已经存在),和bin16 $(SUB_DIR):ECHO  #依赖ECHO,以及编译所有的源码,生成${SUB_DIR}的中间文件,这里等价与执行了make -C ./src ./obj 17     make -C $@18 ECHO:19     @echo $(SUB_DIR)  #打印正在makefile的位置20     @echo bengin compile  #打印开始进行该部分的编译21 clean:   #删除obj文件夹下的所有的.o文件以及bin文件夹下的所有文件22     -rm -rf $(OBJ_DIR)/*.o $(BIN_DIR)
复制代码

src下的makefile(子makefile,将.cc编译为.o)

复制代码
1 #vpath %.h ${INCLUDE}  #已经被注释掉了,因为主makefile已经传递了VPATH的变量2 #vpath %.cc ${SRC}  3 all : $(OBJ_DIR)/main.o $(OBJ_DIR)/student.o  #分别编译main.cc和student.cc4 $(OBJ_DIR)/main.o : main.cc student.h5     $(CC) -c $< -I${INCLUDE} -o $@6 $(OBJ_DIR)/student.o : student.cc student.h7     $(CC) -c $< -I${INCLUDE} -o $@
复制代码

obj下的makefile(子makefile,将.o链接为可执行文件)

复制代码
1 #BIN_DIR := ../bin2 #BIN := hello3 #OBJ := main.o student.o4 #CC = g++5 $(BIN_DIR)/$(BIN):$(OBJ)  #将生成的中间文件链接构建执行文件6     $(CC) $^ -o $@
复制代码

student.h

复制代码
 1 #ifndef _STUDENT 2 #define _STUDENT 3 #include <string> 4 class Student 5 { 6 public: 7     Student(int id,std::string name); 8     std::string getName(); 9 private:10     int id;11     std::string name;12 };13 #endif
复制代码

student.cc

复制代码
1 #include "student.h"2 Student::Student(int id,std::string name):id(id),name(name){3 4 }5 std::string Student::getName()6 {7     return name;8 }
复制代码

main.cc

复制代码
1 #include "student.h"2 Student::Student(int id,std::string name):id(id),name(name){3 4 }5 std::string Student::getName()6 {7     return name;8 }
复制代码

 make后的工程目录为

---include(放置头文件.h)

------student.h(Student类的头文件)

---src(放置源文件.cc)

------student.cc(Student类的定义文件)

------main.cc(main文件)

------makefile(子makefile,将.cc编译为.o)

---obj(放置编译临时文件.o)

------student.o

------main.o

------makefile(子makefile,将.o链接为可执行文件)

---bin(放置生成的可执行文件)

------hello(可执行文件)

---makefile(主makefile,调用子makefile进行项目构建)

 

----------->一个好看的小尾巴
原创粉丝点击