doc1. win10下在VSCode中使用带linux命令的makefile实现编译

背景

本人也是小菜鸟。前段时间在Ubuntu系统下学了一点C++知识,发现自己大部分时间在尝试和配置编程环境。最后把工具定在了使用VSCode进行编辑,在编译时直接把 make 作为 tasks.json 的执行命令,从而直接使用 make 对自己额外写的 makefile 进行操作,实现编译和连接的功能。
现在更详细地介绍一下上述过程,并将之移植到Win10中。移植后,代码几乎完全一致,有良好的通用性。

已经实现的 Ubuntu 环境下的步骤

1.原理级操作

先介绍完全不用特殊工具进行编译的方法。
有幸看到了这个简单却有用的教程,让我快速做到基本理解了比较基础的层面上代码编译的具体步骤。非常推荐新人看这个教程。https://www.cnblogs.com/owlman/p/5514724.html
从中总结出的原理级操作步骤。

  1. 直接使用任意文字编辑器编写代码。
  2. 编写makefile文件。上述链接内最后的那个makefile相当强大,对我这种菜鸟来说,可以这个makefile应该可以直接不加任何修改地让我用很长时间。大家可以直接把这个文件复制下来。在这里把这个文件内容重复一下。
cc = gcc
prom = calc
deps = $(shell find ./ -name "*.h")
src = $(shell find ./ -name "*.c")
obj = $(src:%.c=%.o) 

$(prom): $(obj)
    $(cc) -o $(prom) $(obj)

%.o: %.c $(deps)
    $(cc) -c $< -o $@

clean:
    rm -rf $(obj) $(prom)

以上文件中使用了shell命令 find ,从而实现了从当前文件夹中查找出所有的源文件的功能,极大地提高了makefile文件的通用性。我现在练习的所有工程里,这一文件都可以不加修改地使用(当然,这是C语言的,在C++条件下还得根据情况略加修改)。
实际上,本文的最终目的就是在Win10下也使用该文件。
3. 使用make命令,进行编译。

2. 使用VSCode的操作

  1. 编写代码
  2. 编译。按我的理解,在VSCode中,进行编译实际上是执行tasks.json文件描述的行为。
    将tasks.json保存为如下内容,则生成一个名字为"build"的任务(“label”字段决定),执行这个任务,实际上相当于在当前目录下直接执行“make”命令(“command”字段决定)。所以,如果在当前文件夹下建立makefile文件,进行编译,实际上就是利用make命令执行makefile文件中的操作。这和“原理级操作”中执行的内容是一样的。
{
    "version": "2.0.0",
    "tasks": [
        {
            "label": "build", //任务的名称,可以随便取
            "type": "shell",
            "command": "make"  //make命令,必须是这个值
        }
    ]
}
  1. 调试。在VSCode中,进行调试前需要先生成一个合理的launch.json文件。在这里,我只改了一行内容,即“program”字段(注意,这段代码是windows下该文件的一部分,在Linux下可能与这不太一致,应该也是只需要改动一行)。按这行的设置,在进行调试的时候,实际上相当于执行"a.exe"这个文件。这个文件是makefile中指定的,是编译过程生成的最终结果。大家可以根据自己的情况进行调整,比如使用主函数的文件名等。
    另外,也可以在launch.json文件中加入"预处理任务",比如将上面的“build”作为预处理任务。这样,在每次执行调试时,会先执行"build",再调试,即可以忽略去点击开始编译的操作。虽然看上去高大上,但是我并不喜欢这种感觉,觉得不受控。
{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "(gdb) Launch",
            "type": "cppdbg",
            "request": "launch",
            "program": "${workspaceFolder}/a.exe",  //仅修改了这一行的内容
            "args": [],
            "stopAtEntry": false,
        }
    ]
}

4.成果说明。按照该阶段描述的步骤,需要的文件有,tasks.json,makefile, launch.json。如果合理规划,是有可能生成一套适用于所有工程的文件的。这样我们的精力就可以集中在解决真正的问题上面。

至此,结束Ubuntu环境下的叙述,下面转向Win10。

Win10下的步骤

1.Windows下的原理级操作

刚开始查找的时候看到了这个教程。它介绍了使用MinGW,建立了在Windows中使用gcc等命令的环境。按我的理解,其中设置环境变量的步骤,使我们可以在CMD命令中执行MinGW所提供的exe文件。
http://blog.sina.com.cn/s/blog_bc209e400102x2sm.html
我们想使用的make命令实际上就是make.exe这个文件。但是MinGW安装完毕后这个文件有另一个名称:mingw32-make.exe。 正如这篇文章及其他一些小伙伴所述,很多人喜欢把mingw32-make.exe改名为make.exe,这样就完全和Linux环境下一致了,但是我还是喜欢保留这个比较复杂的名字,让我知道其中的些许原理。

2.Windows下 使用VSCode的操作

windows下VSCode执行步骤可以按这篇教程来做: https://blog.csdn.net/qq_34347375/article/details/80641000
不过该教程指出的步骤只适合较简单的工程。正如我们在Linux中使用makefile一样,我们希望可以在Windows中也只可以有类似的方法,以编译较为复杂的工程。

实际上,对于较为简单的工程(我在这里的意思是源码文件数量很少),将上面两篇教程结合,完全可以实现在VSCode中利用make功能进行编译的功能。与在Linux环境下类似,实现这一功能需要合理地设置tasks.json, makefile, launch.json文件。
在修改这几个文件时,工作量较大的应该是makefile文件的修改。比如至少要把所有的文件输入进去一遍。

我觉得这么做功能不够强大,想用前述的通用性好的那个makefile。但是直接用它时,VSCode提示我找不到文件 ./ 和 -name。无法编译。
于是我又稍微仔细地看了看makefile的相关知识以及Linux基本命令“find”(如前所述,正是这个命令,让makefile文件找到了所需的源文件,而不用我们一个一个输入)。发现在makefile中,是可以使用Linux命令的,就如之前那个通用的makefile文件。
另一方面,根据在Linux下的思路,我想在Win10下执行这个makefile中的find命令应该相当于在CMD条件下直接输入find。于是我查找了一下在CMD条件下find的用法,发现这个命令与Shell下的find完全不一样。出现上面的问题,应该就是我写了一条Linux命令,但是在CMD条件下,执行不了。

经过搜索,找到了一个更加完善的,可以在Windows下执行Linux命令的方式,使用MSYS。我现在还不知道具体原理,甚至忘了我的MSYS是什么时候装上的,但是现在我打开我的MinGW 安装管理器,发现MSYS就在里面。
在这里插入图片描述
我查看了MSYS的bin目录(我的是C:\MinGW\msys\1.0\bin),发现里面有个find.exe文件(其实也有make.exe)。于是解决方法来了:把上面的目录加入Windows下的环境变量Path,这样,它里面的所有命令可以直接在CMD中输入而执行。
不过有个冲突就是find.exe在CMD里也有,为了解决这个冲突,我把msys中的find.exe改名为msys-find.exe。再在CMD里执行msys-find命令,我发现这与Linux环境下的find功能一致了。根据上述过程,把通用的makefile文件稍作修改,可以在Windows下使用了。

cc = gcc
prom = calc
deps = $(shell msys-find ./ -name "*.h")
src = $(shell msys-find ./ -name "*.c")
obj = $(src:%.c=%.o) 

$(prom): $(obj)
    $(cc) -o $(prom) $(obj)

%.o: %.c $(deps)
    $(cc) -c $< -o $@

clean:
    rm -rf $(obj) $(prom)

感觉越写越乱,没有条理了。可能跟刚开始理解一点有关。现在强行把Windows下使用较为通用的makefile实现编译的步骤总结一下。
1.准备工作。安装MinGW,MSYS。
参考资料:Windows下使用VSCode的基本步骤 https://blog.csdn.net/qq_34347375/article/details/80641000
安装MSYS https://blog.csdn.net/yangyangyang20092010/article/details/46350519
Windows下使用makefile http://blog.sina.com.cn/s/blog_bc209e400102x2sm.html
2.编写代码。
3.编写通用的makefile文件。注意此时需要使用的shell命令,比如msys-find,rm等,实际上就是MinGW和MYSYS提供的。注意:MYSYS的bin文件夹中提供的本来是find.exe,为了与CMD命令中的find区分开来,我将之改名为msys-find.exe。该文件示例见上一段代码。
4.合理修改task.json文件,示例如下。其中“command”字段的值“mingw32-make”即为MinGW提供的mingw32-make.exe,实际上MYSYS的bin文件夹中也有个make.exe,用哪一个都可以。

{
    "version": "2.0.0",
    "tasks": [
        {
            "label": "build",
            "type": "shell",
            "command": "mingw32-make"
        }
    ]
}

5.合理修改lauch.json。在这里很多项设置需要依据步骤1准备工作中的第一个参考资料来设置,但是"program"的值应该设置为你通过编译所生成的exe名称。示例如下。

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "myj Launch",
            "type": "cppdbg",
            "request": "launch",
            "program": "${workspaceFolder}/calc.exe",
            "args": [],
            "stopAtEntry": false,
            "cwd": "${workspaceFolder}",
            "environment": [],
            "externalConsole": true,
            "MIMode": "gdb",
            "miDebuggerPath": "C:/MinGW/bin/gdb.exe",
            "setupCommands": [
                {
                    "description": "Enable pretty-printing for gdb",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                }
            ]
        }
    ]
}
  • 6
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值