毕业后终于有了一点空闲时间,可以来继续倒腾倒腾自己的电脑了。自然想起了微软大爷的一堆东西,便想先搞搞VSCode试试。
事出有因,作为一个编程小白,以前写程序都是用微软各版本的航母VisualStudio,虽说性能分析、语法纠错什么的蛮好用,但还是想再试着配置一下轻量级的编辑器,以为能加深自己对程序实现过程的理解吧。年少无知的时候折腾过Vim、Emacs、Atom、Editplus,但都不很如意。一方面是没有坚持下来长时间写程序,导致没有形成自己的习惯;另一方面也是因为平时更经常看用MATLAB,对编程的理解始终感觉不到位。
查到很多个配置方案并一个一个试过后,终于实现了用VSCode写程序的第一步。开始折腾!
关于编译器,据说:
1. 可以选择LLVM、MinGW64、Tdm-gcc等主流编译环境的其中一个。其中LLVM前端(词法、语法分析、语义分析、生成中间代码)使用的是clang,效率上优于后面三个所使用的gcc。(2018.3.)
2. 在 Windows 下安装 Clang 是一件不太愉快的事情,如果在安装时遇到困难,大可放弃安装 Clang ,转而安装 GCC。(2017.8.)
作为小白,尽管看了些讲LLVM和GCC区别的文章,但是并不能很好地体会到两者的区别。也看到很多配置里,将intelliSenseMode改为clang-x64,但是其command设置是g++,仿佛是将LLVM和MinGW64混合起来了一样。暂时没有搞懂,详情再看。
另外我发现,截止目前的LLVM已经将clang更新到6.0.0版本,对于Windows来说安装已经非常友好了。加上本来就安装好的MinGW64,我也打算把这两个都搞出来得了!
- 编译器下载安装包还是压缩包无所谓,重点是要确认系统环境变量路径中有
**\LLVM\bin
和**\MinGW64\bin
这两个。个人感觉安装包似乎好管理一些。
- 下载好VSCode自然是必不可少的!直接在官网下载即可,支持开源。
- 也一定要下载好大家都说到的Microsoft官网的插件
C/C++
。 - 以及其他非必要的、凭个人喜好下载的插件,如
C/C++ Clang Command Adapter
、VSCode Great Icons
等。
- 听说了各种都能配置好的方案,我挑了其中相当简单的一种自己实现了出来。没有什么Makefile跨平台这类高级操作,完全依赖 VS Code内置工具实现工作环境配置。
- 依下面顺序进行各个配置文件的更改。如果复制进文件保存时候报错,去掉中文注释内容即可。
- 在这个配置文件中,目前猜测主要确定了C++调用头文件的位置,其他功能还需细看发现。有些方案中,看到这里除了Win32之外还有Ubuntu、mac等名称,暂且按下不提。
{ "configurations": [ { "name": "Win32", "intelliSenseMode": "clang-x64", // 此处设置包含系统环境路径 "includePath": [ "/usr/include", "/usr/local/include", "${workspaceFolder}" ], "defines": [ "_DEBUG", "UNICODE", "__GNUC__=7", "__cdecl=__attribute__((__cdecl__))" ], "browse": { "path": [ "/usr/include", "/usr/local/include", "${workspaceFolder}" ] }, "limitSymbolsToIncludedHeaders": true, "databaseFilename": "", // 此处设置编译器路径,应将其更改为自己的g++.exe所在路径 "compilerPath": "E:/Environment/MinGW64/bin/g++.exe", "cStandard": "c11", "cppStandard": "c++17" } ], "version": 4 }
- tasks是在F1的命令行中键入Tasks: Run Task后生成的模板中更改的。据不成熟的理解,这个文件限定了当前文件执行任务的过程和属性。
{ "version": "2.0.0", "tasks": [ { "label": "Compile", "command": "g++", "args": [ "-g",//指定编译源代码文件 "${file}", "-o",// 指定输出文件名,不加该参数则默认输出a.exe "${fileDirname}/${fileBasenameNoExtension}.exe", "-ggdb3", // 生成和调试有关的信息 "-Wall", // 开启额外警告 "-static-libgcc", // 静态链接 "-Wno-format", "-finput-charset=UTF-8",//输入编译器文本编码 默认为UTF-8 "-fexec-charset=GBK"//编译器输出文本编码 自行选择 ], "type": "shell", "group": { "kind": "build", "isDefault": true }, "presentation": { "echo": true, "reveal": "always", "focus": false, "panel": "shared" }, "problemMatcher": { "owner": "cpp", "fileLocation": [ "relative","\\" ], "pattern":{ "regexp": "^(.*):(\\d+):(\\d+):\\s+(warning|error):\\s+(.*)$", "file": 1, "line": 2, "column": 3, "severity": 4, "message": 5 } } } ] }
- launch似乎是在按下F5时“运行”的文件。刚开始每次编译运行都要通过F1打开的命令行中运行task,然后才可以用F5和Ctrl+F5运行编译生成的exe文件。有了”preLaunchTask”之后,就可以直接与tasks中的各项任务相绑定,大大减小了编译时耗费的心力和时间。
{ "version": "0.2.0", "configurations": [ { "name": "C++ Launch (GDB)", // 配置名称,将会在启动配置的下拉菜单中显示 "type": "cppdbg", // 配置类型,这里只能为cppdbg "request": "launch", // 请求配置类型,可以为launch(启动)或attach(附加) "targetArchitecture": "x64", // 生成目标架构,一般为x86或x64 "program": "${fileDirname}/${fileBasenameNoExtension}.exe", // 将要进行调试的程序的路径 "args": [], // 程序调试时传递给程序的命令行参数,一般设为空即可 "stopAtEntry": false, // 设为true时程序将暂停在程序入口处,一般设置为false "cwd": "${workspaceRoot}", // 调试程序时的工作目录,一般为${workspaceRoot} "externalConsole": true, // 调试时是否显示控制台窗口,一般设置为true显示控制台 "internalConsoleOptions": "neverOpen", // 如果不设为neverOpen,调试时会跳到“调试控制台”选项卡", "MIMode": "gdb", // 指定连接的调试器 "miDebuggerPath": "E:/Environment/MinGW64/bin/gdb.exe", // 调试器路径 "setupCommands": [ { "description": "Enable pretty-printing for GDB", "text": "-enable-pretty-printing", "ignoreFailures": false } ], // 此处设置按下F5调用的tasks.json中的任务标签label "preLaunchTask": "Compile" } ] }
- 这个好像随意配置……我也把我改的一些放上来吧。
- 原理是从默认配置中复制相关设置到用户设置空间并覆盖默认设置,这个设定感觉相当棒!不会清除默认配置,又可以实现用户自定义配置。以这种形式实现我倒是第一次发现。
{ "workbench.colorTheme": "Hopscotch", "atomKeymap.promptV3Features": true, "editor.multiCursorModifier": "ctrlCmd", "editor.fontSize": 16, "files.associations": { "*.json": "jsonc", "*.cfg": "ini", "*.fsh": "glsl", "stack": "cpp", "iostream": "cpp", "ostream": "cpp", "*.tcc": "cpp", "cctype": "cpp", "clocale": "cpp", "cmath": "cpp", "cstdint": "cpp", "cstdio": "cpp", "cstdlib": "cpp", "cwchar": "cpp", "cwctype": "cpp", "exception": "cpp", "initializer_list": "cpp", "iosfwd": "cpp", "istream": "cpp", "limits": "cpp", "new": "cpp", "stdexcept": "cpp", "streambuf": "cpp", "system_error": "cpp", "type_traits": "cpp", "typeinfo": "cpp", "utility": "cpp" }, "editor.snippetSuggestions": "top", "C_Cpp.clang_format_sortIncludes": true, "editor.wordWrap": "on", "editor.formatOnPaste": true, "editor.formatOnType": true, }
- 以上四个json文件在.vscode文件夹内,由VSCode软件自动生成,似乎每次新建的时候都需要重新设置。因此我的打算是建立一个文件夹,先用一个测试案例将配置文件设置好,然后就在这个文件夹内写以后的很多小程序,省去了每次都要打开这些文件复制到新文件的配置文件里的麻烦。
- 我就是在C++配置文件中设置
"intelliSenseMode": "clang-x64"
,在tasks配置文件中设置"command": "g++"
,目前并不知道这样做会有什么后果。
- 更多详细内容,且听下回分晓。工地上事情马上就要多起来了,希望能有集中的时间再玩下去。
- 本文暂时只实现了VSCode中编译C++程序的最简单配置,能够运行书上的各种练习程序。
- 今日时间不够,下次再说碰到的各种问题。
文章来源: 在VSCode中写简单的C++程序