IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 2021-09-12 -> 正文阅读

[C++知识库]2021-09-12

嵌套makefile小型范例

make前后文件夹目录结构

这张图片左图和右图分别是make前后的文件夹目录变化,make之后生成了3个.o文件位于obj目录下,还生成了一个bin目录,其下生成了可执行文件test。下面是几个.cpp文件和.h文件的代码,很简单的代码,主要是为了演示嵌套makefile。

//test.h文件
#pragma once
void print();
//test.cpp
#include "../include/test.h"
#include <iostream>
void print()
{std::cout << "print()..." << std::endl;}
//eat.h
#pragma once
void eat();
//eat.cpp
#include "eat.h"
#include <iostream>
void eat()
{std::cout << "eat()..." << std::endl;}
//main.cpp
#include "../include/test.h"
#include "../src/eat/eat.h"
int main()
{
	eat();
	print();
	return 0;
}

下面是最顶层的Makefile文件内容

  1 OBJ := main.o test.o eat.o
  2 TOP_DIR := $(PWD)
  3 OBJ_DIR := $(TOP_DIR)/obj
  4 BIN_DIR := $(TOP_DIR)/bin
  5 BIN:= test
  6 SUB_DIR := main \
  7             src \
  8             src/eat \
  9             obj
 10 export OBJ TOP_DIR OBJ_DIR BIN_DIR BIN
 11
 12 all: CHECKDIR $(SUB_DIR)
 13
 14 CHECKDIR:
 15     mkdir -p $(SUB_DIR) $(BIN_DIR)
 16 $(SUB_DIR):ECHO
 17     make -C $@   #执行SUB_DIR的makefile
 18 ECHO:
 19     @echo $(SUB_DIR)
 20     @echo begin compile
 21
 22 clean:
 23     rm -rf $(OBJ_DIR)/*.o $(BIN_DIR)
 24
 25 .PHONY = all CHECKDIR ECHO clean

分行进行解析:(数字代表行数)
1.设置所有生成的.o文件
2.获取当前工作目录,PWD是makefile自带变量,PWD=$(shell pwd)
3.存放将要生成的.o文件目录
4.可执行文件目录
5.目标文件(在这里就是可执行文件test)名称
6.所有工程需要子目录名称
10.export设置全局变量,代表这些变量在下层的makefile中都可以直接使用,且值不变
25. .PHONY设置all CHECKDIR ECHO clean四个伪目标,伪目标的意思就是不会生成该文件,也可以没有依赖,在这里.PHONY其实也可以不设置,make能自行判断伪目标
12.第一个伪目标,依赖于CHECKDIR和(SUB_DIR)
14-17.生成对应的文件夹并向下执行Makefile
18-20.仅仅是打印一些信息
22、23.删除make生成的所有.o文件和可执行文件

Note:上述语句中需要注意的就是12-17几行,由于makefile中的目标与依赖文件关系,有点类似于栈的性质,拿这里举例,make发现all依赖于CHECKDIR和(SUBDIR),但是这两依赖文件都还没有,继续往下找,先找CHECKDIR怎么生成,发现了14行有目标CHENKDIR,没有依赖就执行15行的命令(如果CHECKDIR还有依赖,继续往下找);all目标的第一个依赖被解决了,继续找第二个依赖(SUB_DIR),发现其还有依赖ECHO,ECHO在18行作为目标没有依赖,所以总是先执行ECHO的打印信息,然后再执行下层的makefile,如下图所示(第一行是创建目录,第二行和第三行就是ECHO打印的信息)
在这里插入图片描述
再来简单的看下其他的下层Makefile

#main目录下的makefile
$(OBJ_DIR)/main.o:main.cpp
	$(CXX) -c $^ -o $@
#src目录下的makefile
$(OBJ_DIR)/test.o: test.cpp
	$(CXX) -c $^ -o $@
#src/eat目录下的makefile
$(OBJ_DIR)/eat.o: eat.cpp
	$(CXX) -c $^ -o $@
#obj目录下的makefile
$(BIN_DIR)/$(BIN):$(OBJ)
	$(CXX) $^ -o $@
  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-09-13 09:05:31  更:2021-09-13 09:06:21 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 23:08:31-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码