学习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进行项目构建)
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的一个工程示例的更多相关文章
- Python学习笔记_一个Tkinter示例,使用FileDialog
为了使用Python进行数据分析,编写一个图形界面,选择一个Excel文件(或CSV),然后进行后续处理. 一.本示例涵盖如下知识点: 1.FileDialog的使用 2.退出程序 3.消息提示框的示 ...
- WCF学习之旅——第一个WCF示例(一)
最近需要用到WCF,所以对WCF进行了解.在实践中学习新知识是最快的,接下来先做了一个简单的WCF服用应用示例. 本文的WCF服务应用功能很简单,却涵盖了一个完整WCF应用的基本结构.希望本文能对那些 ...
- WCF学习之旅——第一个WCF示例(三)
第五步:创建客户端 WCF应用服务被成功寄宿后,WCF服务应用便开始了服务调用请求的监听工作.此外,服务寄宿将服务描述通过元数据的形式发布出来,相应的客户端就可以获取这些元数据.接下来我们来创建客户端 ...
- WCF学习之旅——第一个WCF示例(二)
第四步:通过自我寄宿的方式寄宿服务 WCF服务需要依存一个运行着的进程(宿主),服务寄宿就是为服务指定一个宿主的过程.WCF是一个基于消息的通信框架,采用基于终结点(Endpoint)的通信手段. 终 ...
- SQL 数据库 学习 007 通过一个示例简单介绍什么是字段、属性、列、元组、记录、表、主键、外键 (上)
SQL 数据库 学习 007 通过一个示例简单介绍什么是字段.属性.列.元组.记录.表.主键.外键 (上) 我们来介绍一下:数据库是如何存储数据的. 数据库是如何存储数据的 来看一个小例子 scott ...
- Linux C编程学习之开发工具3---多文件项目管理、Makefile、一个通用的Makefile
GNU Make简介 大型项目的开发过程中,往往会划分出若干个功能模块,这样可以保证软件的易维护性. 作为项目的组成部分,各个模块不可避免的存在各种联系,如果其中某个模块发生改动,那么其他的模块需要相 ...
- make 与makefile(会不会写 makefile,从一个侧面说明了一个人是否具备完成大型工程的能力。)
跟我一起写 Makefile /**/ 陈皓 (CSDN) 概述 —— 什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都为你做了这个工作,但我觉 ...
- Wordcount on YARN 一个MapReduce示例
Hadoop YARN版本:2.2.0 关于hadoop yarn的环境搭建可以参考这篇博文:Hadoop 2.0安装以及不停集群加datanode hadoop hdfs yarn伪分布式运行,有如 ...
- ASP.NET MVC Web API 学习笔记---第一个Web API程序
http://www.cnblogs.com/qingyuan/archive/2012/10/12/2720824.html GetListAll /api/Contact GetListBySex ...
随机推荐
- javascript入门知识点总结(一)
学了几天javascript,现总结一下原生javascript的基本知识点. 一.javascript基本知识 变量 定义: var a = 123; var b = 'abc'; //连写 var ...
- Windows中 MySQL5.7.17解压版安装步骤
1.先去MySQL官网下载.当前最新版是5.7.19,可能安装方法不同了,本人测试没有安装成功,若有安装成功的朋友,希望分享一下安装步骤. 个人推荐下载MySQL5.7.17,官方下载网址:https ...
- Nodejs.安装.非源码方式安装Node.js (Centos)
已验证的适用环境: Centos6.x 树莓派官方ROM(Raspbian) 先去官网下载已编译好的安装包 https://nodejs.org/en/download/current/ 以Cent ...
- C++函数重载和函数模板(04)
函数重载 函数重载可以使一个函数名具有多种功能,即具有“多种形态”,这种特性称为多态性. C++的多态性又被直观地称为“一个名字,多个函数”.源代码只指明函数调用,而不说明具体调用哪个函数.编译器的这 ...
- C语言编写一个简单游戏
感悟:这算是一个起点吧,我都大二了,还这么菜,才开始写游戏,这个游戏很简单,利用随机数猜大小! #include <stdlib.h> #include <stdio.h> # ...
- 压缩感知重构算法之压缩采样匹配追踪(CoSaMP)
压缩采样匹配追踪(CompressiveSampling MP)是D. Needell继ROMP之后提出的又一个具有较大影响力的重构算法.CoSaMP也是对OMP的一种改进,每次迭代选择多个原子,除了 ...
- V6厂最新V4版本卡地亚蓝气球大号42mm男表|价格报价|
大家好!为大家带来一款贵族气质的V6厂卡地亚蓝气球大号42mm男表!众所周知卡地亚品牌给人的印象是非常尊贵.奢华的,而且卡地亚蓝气球系列的表款都有着极高的识别度,而且每一款都是极受欢迎的热门腕表,接下 ...
- Python基础学习参考(一):python初体验
一.前期准备 对于python的学习,首先的有一个硬件电脑,软件python的运行环境.说了一句废话,对于很多初学者而言,安装运行环境配置环境变量的什么的各种头疼,常常在第一步就被卡死了,对于pyth ...
- 【机器学习】TensorFlow学习(一)
感谢中国人民大学胡鹤老师,课讲得非常好~ 首先,何谓tensor?即高维向量,例如矩阵是二维,tensor是更广义意义上的n维向量(有type+shape) TensorFlow执行过程为定义图,其中 ...
- 表空间与数据文件Offline,online的区别
首先明确,表空间与数据文件的关系:Oracle数据库表空间有两种,一种smallfile小文件表空间(默认),另一种bigfile大文件表空间: 默认表空间与数据文件的关系:允许一对多的处理方式,一个 ...