以前写过同样话题下的图文版的,这里给出一个代码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. 《Android开发卷——开卷》

    打算在自己在工作中遇到的问题,技术难点都记录下来,让其他人可以借鉴或者指点,这样既可以成长自己也可以成长别人.因为自己已经在工作了,所以遇到的问题非常具有代表性,所以不能简单简单的像网上一些小学生一样 ...

  2. react 使用 error 报错

    在使用react 中报错原因总结 01 // Warning: Can't call setState on a component that is not yet mounted. This is ...

  3. CloseableHttpClient 连接超时导致XxlJob调度阻塞,影响调度任务的执行

    CloseableHttpClient 连接超时导致XxlJob调度阻塞,影响调度任务的执行 问题原因1.分析日志发现,xxlJob后台界面没有执行时间和执行结果,在某一个时间点之后,某一个任务因为阻 ...

  4. http请求方式-OkHttpClient

    http请求方式-OkHttpClient import com.example.core.mydemo.http.OrderReqVO; import okhttp3.*; import org.s ...

  5. 向web服务器下载文件

    web服务器向客户端发送文件 Web服务器读取一个文件的二进制数据,把这组二进制数据发送个客户端,服务器发送给客户端的HTML文档的本质也是二进制.客户端使用以下代码读文件 response = ur ...

  6. BST-splay板子 - 维护一个分裂和合并的序列

    splay 均摊复杂度 \(O(\log n)\) 证明: https://www.cnblogs.com/Mr-Spade/p/9715203.html 我这个 splay 有两个哨兵节点,分别是1 ...

  7. 面试官:transient关键字修饰的变量当真不可序列化?我:烦请先生教我!

    一.写在开头 在这篇文章中记录一下之前自己面试时学到的东西,是关于transient关键字的,当时面试官问我IO的相关问题,基本上全答出来了,关于如何不序列化对象中某个字段时,我果断的选择了stati ...

  8. Excel插件之连接数据数据库秒数处理,办公轻松化

    接上文,对excel连接数据库需求的进一步优化: Excel 更改数据同步更新到Mysql数据库 1.通过mysql for excel 插件的思路,了解到一个新的插件 sqlcel,通过这个插件ex ...

  9. 【ClickHouse问题】更新表字段类型为Nullable(Int32)的列值,最终结果都是固定一个值:93147008???

    问题描述: clickhouse更新表数据.更新的列数据类型是Nullable(Int32),不管更新为什么数值,最后查询的结果都是一个固定值:93147008 问题复现: 1:建一张测试表 CREA ...

  10. ubuntu16.04 python2&3 pip升级后报错:sys.stderr.write(f"ERROR: {exc}")

    ubuntu16.04 python2&3 pip升级后报错: sys.stderr.write(f"ERROR: {exc}") 描述 最近使用ubuntu16.04上的 ...