zoukankan      html  css  js  c++  java
  • Win 10 MSYS2 VS Code 配置 c++ 的编译环境

    博客参考 https://www.cnblogs.com/esllovesn/p/10012653.html 和 https://blog.csdn.net/bat67/article/details/76095813

    VS Code 是微软发布一款跨平台的源代码编辑器,其拥有强大的功能和丰富的扩展,使之能适合编写许多语言。

    本文面向初学者(但不是纯小白),分享一点我配置C/C++的经验。

    本文所有内容均可从VS Code的官方文档:C++ programming with Visual Studio Code 以及各个扩展的文档中获得,并且他们还会进行更新。

    我的环境:64位Windows 10。VS Code的配置文件在Linux下应该也是通用的,但需要修改路径等部位配置。

    1. 先安装 MSYS 2 https://www.cnblogs.com/flyinggod/p/10841636.html

    2.修改msys 源( 否则下载包会失败)  https://www.cnblogs.com/flyinggod/p/10841291.html

    3.下载并安装 VS Code

    4.配置 VS Code 的c++编译环境,

    4.1 选中c++ 相关的配置,会在本地多出一个.vscode的文件,并有 launch.json 文件。这进行配置

    stopAtEntry可根据自己喜好修改;cwd可以控制程序运行时的相对路径,如有需要可以改为${fileDirname}。其他无需更改,除非你不用windows,则可以用lldb调试(需要自己装)。type和request不变色是正常现象。

    // https://github.com/Microsoft/vscode-cpptools/blob/master/launch.md
    {
        "version": "0.2.0",
        "configurations": [
            {
                "name": "(gdb) Launch", // 配置名称,将会在启动配置的下拉菜单中显示
                "type": "cppdbg", // 配置类型,这里只能为cppdbg
                "request": "launch", // 请求配置类型,可以为launch(启动)或attach(附加)
                "program": "${fileDirname}/${fileBasenameNoExtension}.exe", // 将要进行调试的程序的路径
                "args": [], // 程序调试时传递给程序的命令行参数,一般设为空即可
                "stopAtEntry": true, // 设为true时程序将暂停在程序入口处,我一般设置为true
                "cwd": "${workspaceFolder}", // 调试程序时的工作目录
                "environment": [], // (环境变量?)
                "externalConsole": true, // 调试时是否显示控制台窗口,一般设置为true显示控制台
                "internalConsoleOptions": "neverOpen", // 如果不设为neverOpen,调试时会跳到“调试控制台”选项卡,你应该不需要对gdb手动输命令吧?
                "MIMode": "gdb", // 指定连接的调试器,可以为gdb或lldb。但目前lldb在windows下没有预编译好的版本。
                "miDebuggerPath": "gdb.exe", // 调试器路径。
                "setupCommands": [
                    {
                        "description": "Enable pretty-printing for gdb",
                        "text": "-enable-pretty-printing",
                        "ignoreFailures": false
                    }
                ],
                "preLaunchTask": "Compile" // 调试会话开始前执行的任务,一般为编译程序。与tasks.json的label相对应
            }
        ]
    }
    
    miDebuggerPath 节点的配置,要与本地的路径一致(由于我已经将GCC路径设置为环境变量,所以这儿直接就是gdb.exe,没有设置的话可以配置为全局路径即可).配置好了之后,F5启动调试,这个时候,会让你配置tasks.json。 会出现,一个下拉框,你随便选择一个(目的,是为了出现 tasks.json 文件),这样,直接 配置 tasks.json 文件即可;

    4.2 配置 tasks.json 文件

    reveal可根据自己喜好修改,即使设为never,也只是编译时不跳转到“终端”而已,手动点进去还是可以看到,我个人设为never。命令行参数方面,-std根据自己的需要修改。如果使用Clang编写C语言,把command的值改成clang。如果使用MinGW,编译C用gcc,编译c++用g++,并把-target和-fcolor那两条删去。如果不想要额外警告,把-Wall那一条删去。

    // https://code.visualstudio.com/docs/editor/tasks
    {
        "version": "2.0.0",
        "tasks": [
            {
                "label": "Compile", // 任务名称,与launch.json的preLaunchTask相对应
                "command": "g++", // 要使用的编译器
                "args": [
                    "${file}",
                    "-o", // 指定输出文件名,不加该参数则默认输出a.exe
                    "${fileDirname}/${fileBasenameNoExtension}.exe",
                    "-g", // 生成和调试有关的信息
                    "-Wall", // 开启额外警告
                    "-static-libgcc", // 静态链接
                    "-std=c++17" // C语言最新标准为c11,或根据自己的需要进行修改
                ], // 编译命令参数
                "type": "shell",
                "group": {
                    "kind": "build",
                    "isDefault": true // 设为false可做到一个tasks.json配置多个编译指令,需要自己修改本文件,我这里不多提
                },
                "presentation": {
                    "echo": true,
                    "reveal": "always", // 在“终端”中显示编译信息的策略,可以为always,silent,never。具体参见VSC的文档
                    "focus": false, // 设为true后可以使执行task时焦点聚集在终端,但对编译c和c++来说,设为true没有意义
                    "panel": "shared" // 不同的文件的编译信息共享一个终端面板
                },
                 "problemMatcher":"$gcc" // 如果你不使用clang,去掉前面的注释符,并在上一条之后加个逗号。照着我的教程做的不需要改(也可以把这行删去)
            }
        ]
    }
    

    4.3 c_cpp_properties.json

    此文件内容来自于Microsoft/vscode-cpptools;这个json不允许有注释(其实按照标准本来就不能有)。如果你没有合并Clang和MinGW,则该文件中的compilerPath必需修改成MinGW的完整路径,精确到gcc.exe,否则会提示找不到头文件;Linux下应该是/usr/bin/gcc。如果你自己编写了头文件又不在workspaceFolder下,路径也要加到includePath和browse里。这些路径是否递归有效暂时未知,我的测试是有效的。Windows下的路径为反斜杠,原本应使用两个反斜杠来转义,但直接用斜杠在VS Code中也接受。

    {
        "configurations": [
            {
                "name": "MinGW",
                "intelliSenseMode": "clang-x64",
                "compilerPath": "D:/msys64/mingw32/bin/i686-w64-mingw32-gcc.exe",
                "includePath": [
                    "${workspaceFolder}"
    
                ],
                "defines": [],
                "browse": {
                    "path": [
                        "${workspaceFolder}"
                    ],
                    "limitSymbolsToIncludedHeaders": true,
                    "databaseFilename": ""
                },
                "cStandard": "c11",
                "cppStandard": "c++17"
            }
        ],
        "version": 4
    }
    

    6.setting.json

    把这个文件里的东西放到“用户设置”里也可以覆盖全局设置,自己进行选择。Code Runner 的命令行和某些选项可以根据自己的需要在此处修改,用法还是参见此扩展的文档和百度gcc使用教程。

    如果你要使用其他地方的头文件和库文件,可能要往clang.cflags和clang.cxxflags里加-I和-L,用法百度gcc使用教程。Linux下去掉code runner 和 flags 的--target那一条,共四个。

    {
        "files.defaultLanguage": "cpp", // ctrl+N新建文件后默认的语言
        "editor.formatOnType": true, // 输入时就进行格式化,默认触发字符较少,分号可以触发
        "editor.snippetSuggestions": "top", // snippets代码优先显示补全
    
        "code-runner.runInTerminal": true, // 设置成false会在“输出”中输出,无法输入
        "code-runner.executorMap": {
            "c": "cd $dir && gcc $fileName -o $fileNameWithoutExt.exe -Wall -g -Og -static-libgcc -std=c11 && $dir$fileNameWithoutExt",
            "cpp": "cd $dir && g++ $fileName -o $fileNameWithoutExt.exe -Wall -g -Og -static-libgcc -std=c++17 && $dir$fileNameWithoutExt"
        }, // 设置code runner的命令行
        "code-runner.saveFileBeforeRun": true, // run code前保存
        "code-runner.preserveFocus": true, // 若为false,run code后光标会聚焦到终端上。如果需要频繁输入数据可设为false
        "code-runner.clearPreviousOutput": false, // 每次run code前清空属于code runner的终端消息
    
        "C_Cpp.clang_format_sortIncludes": true, // 格式化时调整include的顺序(按字母排序)
        "C_Cpp.intelliSenseEngine": "Default", // 可以为Default或Tag Parser,后者较老,功能较简单。具体差别参考cpptools扩展文档
        "C_Cpp.errorSquiggles": "Disabled", // 因为有clang的lint,所以关掉
        "C_Cpp.autocomplete": "Disabled", // 因为有clang的补全,所以关掉
    
        "clang.cflags": [ // 控制c语言静态检测的参数
            "--target=x86_64-w64-mingw",
            "-std=c11",
            "-Wall"
        ],
        "clang.cxxflags": [ // 控制c++静态检测时的参数
            "--target=x86_64-w64-mingw",
            "-std=c++17",
            "-Wall"
        ],
        "clang.completion.enable": true,
        "files.associations": {
            "iostream": "cpp"
        } // 效果效果比cpptools要好
    }
    
    为什么要往json里写这么多的东西?因为VSC本身并没有对C语言特别优待,对其他许多语言也是这样。另外稍微提一下,以$开头的是VSC预定义的变量,具体参见:Variables Reference

    关于VS Code输出会出现乱码,很多人都遇到过。这是因为VS Code内部用的是utf-8编码,cmd/powershell是gbk编码。直接编译,会把“你好”输出成“浣犲ソ”。其实可以点右下角 选Reopen with Encoding 选Chinese GBK 就可以正常输入中文了,而且输出也是正常的还可以在设置里搜索encode,把files.encoding改成gbk,而且最好把files.autoGuessEncoding也改成true





  • 相关阅读:
    主键、外键
    框架学习八:Model查询
    框架学习七:自动验证、填充、字段映射
    框架学习六:ORM方式添加数据
    11.0 C++远征:对象指针
    10.0 C++远征:深拷贝与浅拷贝
    9.0 C++远征:对象成员
    8.0 C++远征:对象数组
    7.0 C++远征:封装小结
    2.0 C++远征:类内定义与内联函数
  • 原文地址:https://www.cnblogs.com/flyinggod/p/10852408.html
Copyright © 2011-2022 走看看