以前写过同样话题下的图文版的,这里给出一个代码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. 在.NET Core,除了VB的LikeString,还有其它方法吗?(四种LikeString实现分享)

    Like运算符很好用,特别是它所提供的其中*.?这两种通配符,在Windows文件系统和各类项目中运用非常广泛. 但Like运算符仅在VB中支持,在C#中,如何实现呢? 以下是关于LikeString ...

  2. 使用 nginx 共享文件

    1. 安装nginx 2. 在nginx的配置文件的server部分加上如下的配置: location /shared/ { autoindex on; autoindex_exact_size on ...

  3. 基于.NET Core + Jquery实现文件断点分片上传

    基于.NET Core + Jquery实现文件断点分片上传 前言 该项目是基于.NET Core 和 Jquery实现的文件分片上传,没有经过测试,因为博主没有那么大的文件去测试,目前上传2G左右的 ...

  4. 记一次RocketMQ消费非顺序消息引起的线上事故

    应用场景 C端用户提交工单.工单创建完成之后.会发布一条工单创建完成的消息事件(异步消息).MQ消费者收到消息之后.会通知各处理器处理该消息.各处理器处理完后都会发布一条将该工单写入搜索引擎的消息.最 ...

  5. 抓取豆瓣电影TOP250标题-年份-评分-评分人数

    import csv import re import requests headers = { 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; ...

  6. NXP i.MX 8M Plus工业核心板规格书(四核ARM Cortex-A53 + 单核ARM Cortex-M7,主频1.6GHz)

      1 核心板简介 创龙科技SOM-TLIMX8MP是一款基于NXP i.MX 8M Plus的四核ARM Cortex-A53 + 单核ARM Cortex-M7异构多核处理器设计的高端工业核心板, ...

  7. throws和try catch的区别

    1.throws是表明方法抛出异常,需要调用者来处理,如果不想处理就一直向外抛,最后会有jvm来处理: 2.try catch 是自己来捕获别人抛出的异常,然后在catch里面去处理: 一般情况下,第 ...

  8. python3 安装pyodbc失败 pip3 install pyodbc

    python3 安装pyodbc失败 报错1: 关键报错信息: fatal error: sql.h: No such file or directory  [root@centfos python3 ...

  9. github中的子模块(git submodule)

    git中支持引用另外一个开源库,并且可以指定依赖的分支或者提交记录号. 比如fltk-rs 库的fltk-sys模块依赖了库 cfltk 并指明了依赖的提交是 8a56507 甚至可以嵌套,毕竟库自身 ...

  10. Java获取客户端请求信息

    客户端工具类 /** * 客户端工具类 * * @author hviger */ public class ServletUtils { /** * 获取String参数 */ public sta ...