首页 > 系统相关 >Linux环境下配置vscode的C/C++ 的make编译环境(编写makefile方式)代码Demo版

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

时间:2022-11-16 23:32:02浏览次数:78  
标签:文件 %. vscode makefile make Makefile 编译 cpp

以前写过同样话题下的图文版的,这里给出一个代码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.bak和Makefile.bak2​最主要的不同在于Makefile.bak​将中间的编译中间文件.o和编译后的可执行文件mainX放在了build文件夹中,而Makefile.bak2则是将编译中间文件.o和源文件.cpp放在了统一路径下。

 

 

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

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

Linux环境下配置vscode的C/C++ 的make编译环境(编写makefile方式)代码Demo版_目标文件

 

 

 

 

 

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

Linux环境下配置vscode的C/C++ 的make编译环境(编写makefile方式)代码Demo版_多目标_02

 

 

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

 

 

 

 

 

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

 

 

 

在​​Makefile.bak2​​中:

Linux环境下配置vscode的C/C++ 的make编译环境(编写makefile方式)代码Demo版_文件路径_03

 

 

 

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 。

 

 

 

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

 

 

Linux环境下配置vscode的C/C++ 的make编译环境(编写makefile方式)代码Demo版_文件路径_04

 

 

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

比如在​​Makefile.bak​​中:

Linux环境下配置vscode的C/C++ 的make编译环境(编写makefile方式)代码Demo版_文件路径_05

 

 

 可以写做:

Linux环境下配置vscode的C/C++ 的make编译环境(编写makefile方式)代码Demo版_C/C++_06

 

 

 

 

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

 

同样:

Linux环境下配置vscode的C/C++ 的make编译环境(编写makefile方式)代码Demo版_目标文件_07

 

 

可以写作:

 

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

 

 

 

 

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

 

 

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

 

 

 

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

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

 

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

 

Linux环境下配置vscode的C/C++ 的make编译环境(编写makefile方式)代码Demo版_C/C++_09

 

 

 

 

Linux环境下配置vscode的C/C++ 的make编译环境(编写makefile方式)代码Demo版_多目标_10

 

 

 

 

 

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

 

 

 

 

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

举例:

Linux环境下配置vscode的C/C++ 的make编译环境(编写makefile方式)代码Demo版_目标文件_11

 

 

 

 

 

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

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

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

 

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

 

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

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

 

 

 

 

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

Linux环境下配置vscode的C/C++ 的make编译环境(编写makefile方式)代码Demo版_文件路径_13

 

 

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

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

Linux环境下配置vscode的C/C++ 的make编译环境(编写makefile方式)代码Demo版_多目标_14

 

 

 而它的完整版应该是:

Linux环境下配置vscode的C/C++ 的make编译环境(编写makefile方式)代码Demo版_C/C++_15

 

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

 

Linux环境下配置vscode的C/C++ 的make编译环境(编写makefile方式)代码Demo版_文件路径_16

 

 

 

 

 

可以看到和

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

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

 

 

 

 

 

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

 

 

 

 

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

 

 

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

Linux环境下配置vscode的C/C++ 的make编译环境(编写makefile方式)代码Demo版_C/C++_17

 

 

 

 

 

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

Linux环境下配置vscode的C/C++ 的make编译环境(编写makefile方式)代码Demo版_目标文件_18

 

 

 

 

 

 

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

Linux环境下配置vscode的C/C++ 的make编译环境(编写makefile方式)代码Demo版_多目标_19

 

 

 

 

 

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

 

 

 

参考:

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

 

标签:文件,%.,vscode,makefile,make,Makefile,编译,cpp
From: https://blog.51cto.com/u_15642578/5857898

相关文章

  • windows--cmake与c++的使用教程(9)
    1概述本文基于前文环境本节目标:动态库和Exe项目修改CMake默认输出路径2准备工作目录结构.│CMakeLists.txt└─srcmain.cc2.1代码准备main......
  • windows--cmake与c++的使用教程(8)
    1概述本文基于前文环境本节目标:基于VSCode,使用CMakeTools插件命令调试程序通过前面可以得知,CMakeTools的其他常用命令已经介绍过了,下面介绍CMake:debug命令......
  • cmake报错找不到Glog、Gflags、Eigen3
    报错内容Bynotproviding"FindGlog.cmake"inCMAKE_MODULE_PATHthisprojecthasaskedCMaketofindapackageconfigurationfileprovidedby"Glog",butCMake......
  • vscode提交git自动格式化的问题
    最近不是在写新项目嘛,发现提交git之后总会有大批的代码变动,而且只是单纯的格式化,这根本没必要,还会妨碍我看我的代码变化,今天有时间了处理一下就是类似这样的代码,在上传git......
  • VSCode+EIDE开发CH32V系列RISC-V MCU
    VSCode+EIDE开发CH32V系列RISC-VMCU1.VSCodeVisualStudionCode(VSCode),是一款由微软开发且跨平台的免费源代码编辑器。该软件支持语法高亮、代码自动补全(又称Int......
  • VSCode For Win7
    原本地址是:https://update.code.visualstudio.com/1.70.2/win32-x64/stable实际地址:https://az764295.vo.msecnd.net/stable/e4503b30fc78200f846c62cf8091b76ff554766......
  • windows--cmake与c++的使用教程(7)
    1概述本文基于前文环境本节目标:结合VSCode,熟悉CMAKE插件的一些用法2CMakeTool插件命令概览VSCode插件命令见下图:3常用命令总结序号名称功能......
  • windows--cmake与c++的使用教程(6)
    1概述本文基于前文环境本节目标:了解CMAKE内置的一些变量以及对应的值2CMake内置变量前面的文章中已经出现了CMAKE_CURRENT_SOURCE_DIR,当时没有说明,现在补上,CM......
  • windows--cmake与c++的使用教程(5)
    1概述本文基于前文环境本节目标:关于cmake脚本错误处理及cmake脚本执行流程2错误提示当脚本语法出错时,cmake会输出错误位于哪个文件、第几行、以及错误原因。......
  • windows--cmake与c++的使用教程(4)
    1概述本文基于前文环境本节目标:编写创建可执行程序exe的cmake脚本2核心代码add_executable命令用于生成可执行程序3用法add_executable(项目名代码文件)......