以前写过同样话题下的图文版的,这里给出一个代码Demo版本,上一个图文版本参见:

Linux环境下配置vscode的C/C++ 的make编译环境(编写makefile方式)

================================================

本文中所介绍的代码Demo版本见地址:

https://gitee.com/devilmaycry812839668/vscode-makefile-demo

该代码的主要内容:

Ubuntu系统下使用vscode作为IDE通过编写Makefile的方式实现对C++代码的编译,这里给出C++示例代码、开发环境vscode环境下的完整配置文件(.vscode/launch.json和.vscode/task.json)、以及编写的Makefile文件。

该项目代码和Linux环境下配置vscode的C/C++ 的make编译环境(编写makefile方式)中的介绍基本一致,可以参考前文来看这个具体的代码,由于Makefile中的执行命令行必须以Tab键起始,因此以网页代码形式展现往往copy下来并不能真正运行,因此这里直接将代码文件上传到gitee中,这样直接down下来代码和配置文件就可以在安装好插件的vscode中直接运行(如何在vscode中安装C++插件本文不进行介绍)。

由于前文Linux环境下配置vscode的C/C++ 的make编译环境(编写makefile方式)已经介绍了vscode中的配置文件(.vscode/launch.json 和 .vscode/task.json),因此本文主要介绍Makefile文件。

===============================================

关于 Makefile 相关内容:

由于Makefile.bak中的内容比较基本就不多介绍了。Makefile.bakMakefile.bak2最主要的不同在于Makefile.bak将中间的编译中间文件.o和编译后的可执行文件mainX放在了build文件夹中,而Makefile.bak2则是将编译中间文件.o和源文件.cpp放在了统一路径下。

由于我们要将编译好的可执行文件放入build文件夹中,因此我们在Makefile中要实现对build文件夹的创建功能。

Makefile.bak中我们将创建文件夹的操作挂靠为一个编译动并将其放在所有编译任务的第一位,以便在执行真正的编译过程之前执行创建文件夹的操作,具体代码为:

Makefile.bak2中我们则是将创建文件夹的操作直接作为一个外部shell命令的调用来引入到Makefile中,具体代码为:

可以看到Makefile.bak2中对文件夹的创建更为便捷。

===============================================

Makefile.bak2中:

SRC为调用shell命令获得所有当前工作目录下的.cpp文件路径的集合并将其赋值给变量SRC。

OBJECT = $(SRC:%.cpp=%.o) 和 OBJECT = $(SRC:.cpp=.o) 所代表的意思相同,都是将SRC变量中的所有路径中的.cpp字符替换为.o字符,可以将该步的操作视作字符替换操作。

在这个字符替换操作中原字符中需要被替换的部分可以有多个,这些需要被替换的字符之间用%做间隔,=后面的替换部分也需和被替换部分的数量相对应,因此也需要用%做间隔,例如:
OBJECT = $(SRC:./%.cpp=./build/%.o)

上面的这步操作是将./替换为./build/  , 将.cpp替换为.o,因此./和.cpp中间用%做间隔,./build/和.o用%做间隔,./main.cpp路径经过替换后为./build/main.o 。

=====================================

$@ 表示一个编译操作中的目标文件,$^表示一个编译操作中的第一个依赖文件,$<表示一个编译操作中所有的依赖文件。

比如在Makefile.bak中:

可以写做:

-------------------------------------------------

同样:

可以写作:

对Makefile.bak文件进行变量替换后给出Makefile.bak3文件。

----------------------------------------------

与$@  ,$^ ,$< ,变量相似的变量为$(@D)  ,$(^D) ,$(<D)和$(@F)  ,$(^F) ,$(<F),其中加D表示在原路径只取目录路径,而加F表示在原路径只取文件名,举例来说,如果$@的为./build/mainX,那么$(@D)表示为./build/,$(@F)表示为mainX,同理$(^D) ,$(<D)也是用来表示目录路径,$(^F) ,$(<F)用来表示文件名。

换句话说,$(@D)表示编译目标的目录路径与$(@F)表示的编译目标的文件名的拼合就是$@所表示编译目标的完整路径。

Makefile.bak2中我们对这几个变量进行了打印,其中@echo表示打印命令:

===============================================

Makefile.bak2中我们还用到了静态模式%.o : %.c,相关概念参考:【转载】 Makefile的静态模式%.o : %.c

举例:

其中,完整的表示多目标编译的操作如下:

$(OBJECT): %.o : %.cpp
$(CXX) -o $@ $^ $(CFLAGS) -c

之所以说叫做多目标编译就是在编写一次编译操作中目标文件不是一个而是多个,这里用 $(OBJECT): %.o 来表示,含义就是代表$(OBJECT)下的所有.o文件,也就是所在这一次编译操作中目标文件为所有$(OBJECT)下的所有.o文件,一直相对应的是依赖文件中的 %.cpp。依赖文件中的%.cpp表示为将目标文件路径的.o替换为.cpp后的所有文件路径。

可以看到,$(OBJECT): %.o : %.cpp 所表示的编译操作中编译目标和依赖文件都是一一对应的,并且有多个编译目标,那么在实际编译中则是进行多次编译操作,也就是分别取出多目标中的一个作为一次编译的目标文件$@和该目标对应的依赖文件$^,由于在多目标编译时每个目标文件的依赖文件只有一个,那么$^等于$<。

鬼&泣 / vscode_makefile_Demo中实际执行该操作为多步编译,如下:

在Makefile中我们也可以简写为:

可以看到我们省略了编译目标的路径,那么这次多目标编译操作中的多目标文件的目录是指当前工作目录,也就是说%.o表示当前工作目录下的所有.o文件,而前面的没简略版的$(OBJECT)则已经指定了一定范围的文件了。更加准确的说前面的完整版的省略版并不是这个,但是由于前面所指定的$(OBJECT)包含的是所有当前工作目录下的.o文件,因此在这里可以这么理解为是省略版。

同理,我们可以直接省略掉具体的编译执行操作:

而它的完整版应该是:

可以看到,在具体的编译操作并没有使用CFLAGS变量,也就是说这样省略的话在实际编译操作中只调用$(CXX) 和 -o  以及 -c ,具体为:

可以看到和

$(OBJECT): %.o : %.cpp
$(CXX) -o $@ $^ $(CFLAGS) -c

所执行的操作是不同的,具体就是没有使用CFLAGS变量。

=================================================

为了把所有的.o文件单独的放入build文件夹中这里又创建了 Makefile.bak4

所有的.o文件均为对应的.cpp文件路径加上./build路径,也就是就所有的.o文件都放入./build文件夹中:

找到所有.cpp文件的目录路径赋值给变量OBJECT_DIR,然后调用外部的shell命令创建目录:

定义多目标编译命令时,.o文件和.cpp文件路径不同的地方为前缀为build,因此在编写模式时要单独在目标模式中将前缀build给出:

=================================================

参考:

【转载】 Makefile的静态模式%.o : %.c

Linux环境下配置vscode的C/C++ 的make编译环境(编写makefile方式)代码Demo版的更多相关文章

  1. WIN7环境下配置vscode c++环境

    目录 安装vscode 添加中文环境支持 添加c++支持 配置c++环境 安装MinGW 配置MinGW环境变量 配置vscode launch文件配置 task文件配置 可能出现的问题 安装vsco ...

  2. 【时序数据库InfluxDB】Windows环境下配置InfluxDB+数据可视化,以及使用 C#进行简单操作的代码实例

    前言:如题.直接上手撸,附带各种截图,就不做介绍了. 1.influxDB的官网下载地址  https://portal.influxdata.com/downloads/ 打开以后,如下图所示,可以 ...

  3. MinGW安装与环境变量配置和Sublime Text 2搭建C++编译环境

    MinGW安装与环境变量配置 从http://sourceforge.net/projects/mingw/下载MinGW,安装到D:\MinGW.工具集选择安装(之后还可以进行安装卸载):至少需要安 ...

  4. Win10环境下配置VScode的C++编译环境

    写前感想:前前后后,折腾好几次,最后还是在学长安利下,开始入坑vscode了.原因一个是小巧,还有就是vs新建工程码题的方式太消耗内存了,基本每个项目就是以MB为单位计算的,然后希望用这篇文章记录自己 ...

  5. Window环境下配置MySQL 5.6的主从复制

    原文:Window环境下配置MySQL 5.6的主从复制 1.环境准备 Windows 7 64位 MySQL 5.6 主库:192.168.103.207 从库:192.168.103.208 2. ...

  6. 在Linux虚拟机下配置jdk的环境变量

    1.到Oracle公司的官网里下载好jdk,网址 http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133 ...

  7. 阿里云ECS服务器Linux环境下配置php服务器(二)--phpMyAdmin篇

    上一篇讲了PHP服务器的基本配置,我们安装了apache,php,还有MySQL,最后还跑通了一个非常简单的php页面,有兴趣的朋友可以看我的这篇博客: 阿里云ECS服务器Linux环境下配置php服 ...

  8. Linux环境下使用VSCode编译makefile文件的注意事项

    Linux环境下使用VSCode编译makefile文件的注意事项 首先安装C/C++的两个依赖 在debug,launch会自动的生成下方的launch.json launch.json { // ...

  9. 【经验之谈】Windows环境下配置WordPress

    前言 wordpress全球著名的开放博客平台,拥有成千上万个各式插件和不计其数的主题模板样式,使用php和mysql搭建,下面说下载windows环境下配置wordpress,经验之谈. 安装 关于 ...

  10. Win8.1系统下配置搭建IIS8.5+PHP5.5.4运行环境

    原文 Win8.1系统下配置搭建IIS8.5+PHP5.5.4运行环境 很多人喜欢用linux搭建php网页语言运行环境,但由于linux高度自定义化,经常需要root运行命令,略显高端,相对应的微软 ...

随机推荐

  1. Vue学习:7.计算属性2

    上一节了解的是计算属性的默认简写,只能读取,不能修改. 什么意思呢?很简单,我们知道计算属性是依赖数据动态计算一个值,那我可不可以直接this.计算属性 = xxx 来修改计算属性的结果呢?这其实是不 ...

  2. java8 Optional使用 stream filter多级过滤

    java8 Optional使用 stream filter多级过滤 package com.example.core.mydemo.java8; public class MyModel { pri ...

  3. 10-Python进程与线程

    Python进程 创建新进程 from multiprocessing import Process import time def run_proc(name): #子进程要执行的代码 for i ...

  4. C++类与对象详解

    什么是类和对象 类和对象的概念 类是对象的抽象,对象是对客观事物的抽象. 用通俗的话来说: 类是类别的意思,是数据类型. 对象是类别下的具体事物. 也就是说: 类是数据类型,对象是变量. 比如: 水果 ...

  5. markdown语法支持测试

    latex 公式 \(v, w, \nu, \omega\) \[\iiint, \oiiint \] \(\Set{ x | x<\frac 1 2 }\) \(\displaystyle \ ...

  6. 阿里云日志Nginx日志分析

    每分钟接口访问次数的前200条统计 not request_uri : "/heartbeat.html" | SELECT time_series(time, '1m', '%H ...

  7. NXP i.MX 6ULL工业开发板规格书( ARM Cortex-A7,主频792MHz)

    1 评估板简介 创龙科技TLIMX6U-EVM是一款基于NXP i.MX 6ULL的ARM Cortex-A7高性能低功耗处理器设计的评估板,由核心板和评估底板组成.核心板经过专业的PCB Layou ...

  8. Mac Eclipse 常用快捷键汇总

    寻找类:shift+command+t 删除当前行:command+d 上移当前行代码:option+↑ 下移当前行代码:option+↓ 复制当前行至下一行:option+command+↓ 复制当 ...

  9. Docker运维之容器的日志清理

    在容器运行的过程中,通常会产生大量的日志,尤其是应用程序本身记录了info级别的日志时候,程序的标准输出记录到容器的日志.这样会占用大量的磁盘空间,严重者导致IO异常,最终服务会宕机. 方案一:定期手 ...

  10. webgl智慧楼宇发光系列之线性采样下高斯模糊

    目录 webgl智慧楼宇发光系列之线性采样下高斯模糊 效率问题 线性采样 代码讲解 总结 参考文档 webgl智慧楼宇发光系列之线性采样下高斯模糊 前面一篇文章 <webgl智慧楼宇发光效果算法 ...