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

以前写过同样话题下的图文版的,这里给出一个代码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

 

posted on 2022-07-10 17:45  Angry_Panda  阅读(1757)  评论(0编辑  收藏  举报

导航