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进行项目构建)
- CC = g++#因为是C++代码,定义编译方式为g++TOP_DIR: =$ {
- PWD
- }#定义当前makefile文件位置SUB_DIR: =src obj#工程中含有makefile,需要进行make的文件夹BIN: =hello#定义最终生成可执行文件的名称BIN_DIR: =$ {
- TOP_DIR
- }
- /bin#定义最终生成可执行文件的放置位置
- OBJ = main.o student.o#定义中间需要生成的中间文件
- OBJ_DIR := $(TOP_DIR)/obj#定义中间文件需要放置的文件夹INCLUDE: =$ {
- TOP_DIR
- }
- /include#定义头文件放置位置
- SRC := ${TOP_DIR}/src#定义源文件放置的位置VPATH: =$ {
- INCLUDE
- }: $ {
- SRC
- }#定义头文件及源文件查找的位置,不设置会导致在编译时找不到头文件或者源文件export CC: TOP_DIR OBJ OBJ_DIR BIN_DIR BIN INCLUDE SRC VPATH#将以上变量导出为全局变量,这样在子makefile也能能够直接使用
- all: CHECKDIR $(SUB_DIR)#当执行make命令时,首先要执行all这段,其依赖于CHECKDIR和$ {
- SUB_DIR
- }的构建CHECKDIR: mkdir - p $(SUB_DIR) $(BIN_DIR)#构建执行中所需要的文件夹,包括src obj(已经存在),和bin $(SUB_DIR) : ECHO#依赖ECHO,以及编译所有的源码,生成$ {
- SUB_DIR
- }的中间文件,这里等价与执行了make - C. / src. / obj make - C $@ECHO: @echo $(SUB_DIR)#打印正在makefile的位置@echo bengin compile#打印开始进行该部分的编译clean: #删除obj文件夹下的所有的.o文件以及bin文件夹下的所有文件 - rm - rf $(OBJ_DIR)
- /*.o $(BIN_DIR)*/
src下的makefile(子makefile,将.cc编译为.o)
- #vpath %.h ${INCLUDE}#已经被注释掉了,因为主makefile已经传递了VPATH的变量
- #vpath %.cc ${SRC}
- all : $(OBJ_DIR)/main.o $(OBJ_DIR)/student.o#分别编译main.cc和student.cc
- $(OBJ_DIR)/main.o : main.cc student.h
- $(CC) -c $< -I${INCLUDE} -o $@
- $(OBJ_DIR)/student.o : student.cc student.h
- $(CC) -c $< -I${INCLUDE} -o $@
obj下的makefile(子makefile,将.o链接为可执行文件)
- #BIN_DIR := ../bin
- #BIN := hello
- #OBJ := main.o student.o
- #CC = g++
- $(BIN_DIR)/$(BIN):$(OBJ)#将生成的中间文件链接构建执行文件
- $(CC) $^ -o $@
student.h
- #ifndef _STUDENT
- #define _STUDENT
- #include <string>
- class Student
- {
- public:
- Student(int id,std::string name);
- std::string getName();
- private:
- int id;
- std::string name;
- };
- #endif
student.cc
- #include "student.h"
- Student::Student(int id,std::string name):id(id),name(name){
- }
- std::string Student::getName()
- {
- return name;
- }
main.cc
- #include "student.h"
- Student::Student(int id,std::string name):id(id),name(name){
- }
- std::string Student::getName()
- {
- return name;
- }
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进行项目构建)
来源: http://www.cnblogs.com/pcxie/p/8000170.html