C++关于Makefile的详解含通用模板
介绍
Makefile是一个规定了怎么去编译和链接程序的脚本文件,在执行make命令时会执行该文件,window环境下的IDE,如visual studio已经集成了该功能,不需要关心程序的编译规则,在linux下做C/C++开发时经常用到,说到这里首先要知道一个工具make。
make是一个解释Makefile中指令的命令工具,常见的IDE都集成了这个工具。目前centos 7.3 GNU的make版本是3.82
规则
目标文件:依赖文件
[Tab]系统指令1 (注意:系统指令前必须有tab)
使用
3.1 简单使用
现有文件main.cpp test.cpp test.h三个文件,说些Makefile实现增量编译(当其中有一个文件变化时,重新编译该文件)
helloworld: main.o test.o g++ main.o test.o -o helloworld main.o: main.cpp test.h g++ -c main.cpp -o main.o test.o: test.cpp test.h g++ -c test.cpp -o test.o clean: rm *.o helloworld
3.2 makefile中使用注释,变量和函数
注释:
行前面加"#"号,如#g++ main.o test.o -o helloworld 表示注释了该行
变量:
- 用=定义一个变量,并且赋值(等号两边可以加空格)
- 用+=追加字符串
- 用$(A)来取得变量的值
例:
A = src echo $(A) @echo $(A) ##只输出echo的结果,不显示执行的命令
特殊变量:
- $@ 目标文件
- $^ 依赖项列表
- $< 依赖项列表第一项
函数:
Makefile中有一些预定义函数,形式:
$(函数名 参数列表)
参数列表:以逗号分隔
函数名和参数之间用空格分开
#获取当前目录路径
PWD = $(shell pwd)
#获取当前目录下所有.cpp文件
CXX_SOURCES = $(wildcard *.cpp)
#获取当前目录下所有.cpp文件编译后的所有目标文件.o
CXX_OBJECTS = $(patsubst *.cpp *.o, $(CXX_SOURCES))
3.3 优化3.1中Makefile
EXE = helloworld GCC = g++ $(EXE): main.o test.o $(GCC) $^ -o $(EXE) main.o: main.cpp test.h $(GCC) -c $< -o $@ test.o: test.cpp test.h $(GCC) -c $< -o $@ clean: rm *.o $(EXE)
3.4 优化3.3中Makefile
继续优化Makefile,添加文件夹,把源码都放入src和lib文件夹,保持增量编译,即为Makefile通用模板
EXE = helloworld GCC = g++ SUBDIR = src lib CPP_SOURCES = $(foreach dir, $(SUBDIR), $(wildcard $(dir)/*.cpp)) CPP_OBJECTS = $(patsubst %.cpp, %.o, $(CPP_SOURCES)) DEP_FILES = $(patsubst %.o, %.d, $(CPP_OBJECTS)) $(EXE): $(CPP_OBJECTS) $(GCC) $(CPP_OBJECTS) -o $@ %.o: %.cpp $(GCC) -c -MMD $< -o $@ -include $(DEP_FILES) clean: rm $(CPP_OBJECTS) $(EXE)
此Makefile可以作为通用Makefile模板来编译C/C++项目,欢迎收藏
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对猪先飞的支持。如果你想了解更多相关内容请查看下面相关链接
相关文章
- vector是表示可以改变大小的数组的序列容器,本文主要介绍了C++STL标准库std::vector的使用详解,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2022-03-06
- 这篇文章主要介绍了C++中取余运算的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-02-23
- 这篇文章主要介绍了C++ string常用截取字符串方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-04-25
- 本文通过例子,讲述了C++调用C#的DLL程序的方法,作出了以下总结,下面就让我们一起来学习吧。...2020-06-25
- 本篇文章主要介绍了C++中四种加密算法之AES源代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。...2020-04-25
- JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。JSON采用完全独立于语言的文本格式,这些特性使JSON成为理想的数据交换语言。易于人阅读和编写,同时也易于机器解析和生成...2021-11-05
- 整数拆分,指把一个整数分解成若干个整数的和。本文重点给大家介绍C++ 整数拆分方法详解,非常不错,感兴趣的朋友一起学习吧...2020-04-25
- 这篇文章主要介绍了C++中Sort函数详细解析,sort函数是algorithm库下的一个函数,sort函数是不稳定的,即大小相同的元素在排序后相对顺序可能发生改变...2022-08-18
- 这篇文章主要介绍了C++万能库头文件在vs中的安装步骤(图文),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-02-23
- 这篇文章主要介绍了Vue中的插槽,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-10-19
深入解析WordPress中加载模板的get_template_part函数
这篇文章主要介绍了WordPress中加载模板的get_template_part函数,其中重点讲解了其函数钩子的使用,需要的朋友可以参考下...2016-01-14- 这篇文章主要介绍了C++ bitset用法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-04-25
- 本篇文章小编并不是为大家讲解string类型的用法,而是讲解我个人比较好奇的问题,就是string 类型占几个字节...2020-04-25
- mysql安装成功后有几个默认的配置模板,列表如下: my-huge.cnf : 用于高端产品服务器,包括1到2GB RAM,主要运行mysql my-innodb-heavy-4G.ini : 用于只有innodb的安装,最多有4GB RAM,支持大的查询和低流量 my-large.cnf : 用于...2015-03-15
- 这篇文章主要为大家介绍了Vue的计算属性,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助...2021-11-16
- 这篇文章主要为大家详细介绍了C++ Eigen库计算矩阵特征值及特征向量,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-04-25
- 这篇文章主要介绍了C++ pair的用法实例详解的相关资料,需要的朋友可以参考下...2020-04-25
- 这篇文章主要介绍了VSCode C++多文件编译的简单使用方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-03-29
- 本篇文章主要讲解C语言 基本语法,这里提供简单的示例和代码来详细讲解C语言的基本语法,开始学习C语言的朋友可以看一下,希望能够给你带来帮助...2021-09-18
- 虽然C++11引入了智能指针的,但是开发人员在与内存的斗争问题上并没有解放,如果我门实用不当仍然有内存泄漏问题,其中智能指针的循环引用缺陷是最大的问题。下面通过实例代码给大家介绍c++中的循环引用,一起看看吧...2020-04-25