前言

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进行项目构建)

学习makefile的一个工程示例的更多相关文章

  1. Python学习笔记_一个Tkinter示例,使用FileDialog

    为了使用Python进行数据分析,编写一个图形界面,选择一个Excel文件(或CSV),然后进行后续处理. 一.本示例涵盖如下知识点: 1.FileDialog的使用 2.退出程序 3.消息提示框的示 ...

  2. WCF学习之旅——第一个WCF示例(一)

    最近需要用到WCF,所以对WCF进行了解.在实践中学习新知识是最快的,接下来先做了一个简单的WCF服用应用示例. 本文的WCF服务应用功能很简单,却涵盖了一个完整WCF应用的基本结构.希望本文能对那些 ...

  3. WCF学习之旅——第一个WCF示例(三)

    第五步:创建客户端 WCF应用服务被成功寄宿后,WCF服务应用便开始了服务调用请求的监听工作.此外,服务寄宿将服务描述通过元数据的形式发布出来,相应的客户端就可以获取这些元数据.接下来我们来创建客户端 ...

  4. WCF学习之旅——第一个WCF示例(二)

    第四步:通过自我寄宿的方式寄宿服务 WCF服务需要依存一个运行着的进程(宿主),服务寄宿就是为服务指定一个宿主的过程.WCF是一个基于消息的通信框架,采用基于终结点(Endpoint)的通信手段. 终 ...

  5. SQL 数据库 学习 007 通过一个示例简单介绍什么是字段、属性、列、元组、记录、表、主键、外键 (上)

    SQL 数据库 学习 007 通过一个示例简单介绍什么是字段.属性.列.元组.记录.表.主键.外键 (上) 我们来介绍一下:数据库是如何存储数据的. 数据库是如何存储数据的 来看一个小例子 scott ...

  6. Linux C编程学习之开发工具3---多文件项目管理、Makefile、一个通用的Makefile

    GNU Make简介 大型项目的开发过程中,往往会划分出若干个功能模块,这样可以保证软件的易维护性. 作为项目的组成部分,各个模块不可避免的存在各种联系,如果其中某个模块发生改动,那么其他的模块需要相 ...

  7. make 与makefile(会不会写 makefile,从一个侧面说明了一个人是否具备完成大型工程的能力。)

    跟我一起写 Makefile /**/ 陈皓 (CSDN) 概述 —— 什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都为你做了这个工作,但我觉 ...

  8. Wordcount on YARN 一个MapReduce示例

    Hadoop YARN版本:2.2.0 关于hadoop yarn的环境搭建可以参考这篇博文:Hadoop 2.0安装以及不停集群加datanode hadoop hdfs yarn伪分布式运行,有如 ...

  9. ASP.NET MVC Web API 学习笔记---第一个Web API程序

    http://www.cnblogs.com/qingyuan/archive/2012/10/12/2720824.html GetListAll /api/Contact GetListBySex ...

随机推荐

  1. 使用Hibernate Tools从数据库逆向生成Hibernate实体类

    自动生成model.java.*.hbm.xml 甚至是dao.java.*.ddl.*.html等等.一般也就如下三种方式1. MyEclipse 自带插件2. jboss的 hibernate-t ...

  2. codeblocks无法编译的问题

    (题外话:网上垃圾资源太多,良心推荐下载 codeblocks的码农们,别TM用DevC++,百度搜索100个不用devc++的理由加上我自己亲身经历!!!) https://jingyan.baid ...

  3. 4本相见恨晚的Linux入门书籍

    有读者问可否推荐一些 Linux 入门书籍,刚好在知乎也看到类似的问题,几个零碎的命令难以在 Linux 环境中存活,如果要真正形成自己的知识体系,还是要靠阅读专业书籍来积累.Linux 对后端开发是 ...

  4. 【机器学习实战】第12章 使用FP-growth算法来高效发现频繁项集

    第12章 使用FP-growth算法来高效发现频繁项集 前言 在 第11章 时我们已经介绍了用 Apriori 算法发现 频繁项集 与 关联规则.本章将继续关注发现 频繁项集 这一任务,并使用 FP- ...

  5. 套接字(linux相关)

    前言:略 一.前因 一切从tcp.udp开始. 众所周知,网络模型一般有两种模型,一种为OSI概念模型(七层),另一种为tcp/ip网络模型(四层). tcp/ip应用层对应OSI的应用层.显示层.会 ...

  6. kafka集群搭建(windows环境下)

    一.简介 Kafka 是一个实现了分布式的.具有分区.以及复制的日志的一个服务.它通过一套独特的设计提供了消息系统中间件的功能.它是一种发布订阅功能的消息系统. 1.名词介绍 Message 消息,就 ...

  7. 关于php的命名空间

    php定义命名空间要使用namespace关键字,例:namespace Database 使用命名空间中的类要使用use关键字,也可以在use后面加as给类取别名,例:use Database\SQ ...

  8. 使用js编写一个简单的运动框架

    下班后,,没事捣鼓捣鼓个人的小爱好. 首先,说明我的这个运动框架(css所有属性)也是常见的框架一种,健壮性并不是太好,对于新手学习倒是挺好,,若是大神,老司机请拐弯. 上来,我们先定义一个区块,然后 ...

  9. JAVA 通过 Socket 实现 TCP 编程

    简介 TCP简介 TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的.可靠的.基于字节流的传输层通信协议,由IETF的RFC 793定义.在简化的计算机 ...

  10. seajs源码

    /*** Sea.js 3.0.0 | seajs.org/LICENSE.md 中文注释由 李祥威 添加,为个人对细节的理解,官方解释很详细的地方就不说了 难免有错漏,联系我: chuangweil ...