学习makefile的一个工程示例
前言
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(已经存在),和bin 16 $(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.cc 4 $(OBJ_DIR)/main.o : main.cc student.h 5 $(CC) -c $< -I${INCLUDE} -o $@ 6 $(OBJ_DIR)/student.o : student.cc student.h 7 $(CC) -c $< -I${INCLUDE} -o $@
obj下的makefile(子makefile,将.o链接为可执行文件)
1 #BIN_DIR := ../bin 2 #BIN := hello 3 #OBJ := main.o student.o 4 #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进行项目构建)