Vscode配置C/C++编程环境@配置C和CPP的运行和调试环境@配置过程的相关问题@中文文件名乱码@build和debug方案组合配置

文章目录

    • abstract
    • gcc/g++文档和用法
      • 常见用例
      • 设置源文件编码和调试信息选型示例
    • 目录.vscode中的相关文件说明
      • tasks.json
      • launch.json
      • c_cpp_properties.json
    • IDE或编辑器配置
      • vscode配置
      • 相关指令和快捷键
      • 默认task配置和取消默认
    • 配置文件
      • 使用vscode预置变量和环境变量
      • 环境变量的使用
        • 使用环境变量的好处
        • 环境变量可能引起的问题
      • 检查编译器所在目录是否正确配置进Path变量
      • 简化编译器,调试器的路径
      • C/C++共用一组tasks.json/launch.json文件?
      • 关于注释
      • 内容示例👺
        • tasks.json内容示例
        • launch.json内容示例
    • 参考的仓库😊
        • 编译和调试选项
    • 编译中文环境下的源代码文件相关问题
    • FAQ
      • 编译多个源文件😊
        • 源文件组织
      • 编译出的可执行文件名中文乱码😊
      • 修改tasks.json和launch.json
    • 早期使用MinGw配置Vscode的C/C++编程环境的探索

abstract

  • 这里假设用户已经正确安装好了编译器,并且能够顺利启动

    • 可以是任何一款编译器,比如应用最广泛的GCC或其在不同系统上的移植版
  • vscode+cpp官方文档教程:

    • C++ programming with Visual Studio Code
      • 这个页面是vscode配置c++环境的首页,指导如何准备(下载)编译器,配置编译器的环境变量
      • 编写并编译第一个C++程序
      • 然后给出许多不同编译器下的跟进一步的和更完整的首次配置教程
      • 包括.vscode中的相关文件介绍
    • 对于轻量环境,选择GCC编译器是好主意,可以参考以下文档
      • Get Started with C++ and MinGW-w64 in Visual Studio Code
  • 图方便开箱即用的话可以用Dev C++:Dev-C++ Overview - Free Tools - Embarcadero

gcc/g++文档和用法

  • GCC online documentation - GNU Project

    • 您可以在线查看或者下载gcc不同版本的详细文档,包括pdf等格式
    • 所有蓝色的链接都是可以跳转的在线网页,或者是可以下载的资源
    • 文档不仅包含gcc也包含g++
  • 也可以只查阅最常用的一部分文档,可以用man命令查看,但是使用浏览器会更便于阅读

  • man gcc (1): GNU project C and C++ compiler (manpages.org)

  • g++(1) - Linux manual page (man7.org)

常见用例

以下是一些常见的GCC/G++编译用法示例:

  1. 基本编译与链接

    g++ source.cpp -o output
    

    这条命令将源文件source.cpp编译并链接为可执行文件output。默认情况下,G++会自动处理依赖关系,编译所有必要的C++源文件,并链接所需的库。

  2. 编译多个源文件

    g++ main.cpp func1.cpp func2.cpp -o program
    

    当项目包含多个源文件时,可以同时指定它们进行编译和链接。

  3. 指定编译标准

    g++ -std=c++11 source.cpp -o output
    

    使用-std选项指定编译器遵循的C++标准版本,如C++11、C++14、C++17、C++20等。

  4. 启用警告

    g++ -Wall -Wextra source.cpp -o output
    

    -Wall开启所有基本警告,-Wextra启用额外警告。这对于发现潜在编程错误非常有帮助。

  5. 优化编译

    g++ -O2 source.cpp -o output
    

    使用-O选项进行优化编译,-O2是常用的优化级别。还有更激进的-O3和禁用优化的-O0

  6. 包含目录

    g++ -I/usr/local/include source.cpp -o output
    

    使用-I选项指定头文件的搜索路径。如果源码中包含了#include <header.h>,而header.h位于/usr/local/include目录下,需要使用此选项。

  7. 链接库

    g++ source.cpp -L/usr/lib -lmylib -o output
    

    -L选项指定库文件的搜索路径,-l选项指定要链接的库。例如,这里链接名为mylib的库。实际链接的是libmylib.solibmylib.a文件。

  8. 生成调试信息

    g++ -g source.cpp -o output
    

    使用-g选项在生成的可执行文件中包含调试信息,便于使用GDB等调试工具进行调试。

  9. 预处理

    gcc -E source.c -o preprocessed_source.i
    

    使用-E选项仅进行预处理,生成预处理后的输出文件preprocessed_source.i

  10. 生成汇编代码

    g++ -S source.cpp -o assembly.s
    

    使用-S选项仅进行编译,生成汇编代码文件assembly.s,不进行汇编和链接。

以上就是一些GCC/G++编译的常见用法示例。根据实际需求,可能需要组合使用这些选项。

设置源文件编码和调试信息选型示例

  • 示例: g++.exe "C:/repos/C_CPP_ConsoleApps/勾股.cpp" -o "C:/repos/C_CPP_ConsoleApps/勾股.exe" -finput-charset=UTF-8 -fexec-charset=gbk -g3 -pipe -Wall

  • 这条命令是用来编译并链接C++源代码文件并生成可执行文件的命令行指令,具体解释如下:

    • g++.exe: 这是Gnu GCC编译器集合中的C++编译器程序,用于编译C++源代码文件。

    • "C:/repos/C_CPP_ConsoleApps/勾股.cpp": 这是待编译的C++源代码文件的完整路径和文件名。该命令会读取这个文件并进行编译。

    • -o "C:/repos/C_CPP_ConsoleApps/勾股.exe": -o选项后面跟着的是指定输出的目标文件名及路径。在这个例子中,编译后生成的可执行文件会被命名为勾股.exe,并将保存在指定的目录C:/repos/C_CPP_ConsoleApps/下。

    • -finput-charset=UTF-8: 这个选项指示编译器按照UTF-8字符集来解析输入(源代码)文件。

    • -fexec-charset=gbk: 这个选项指定了生成的可执行文件中内嵌字符串的字符集为GBK,这意味着编译后的程序在运行时输出的文本字符串将以GBK编码格式展示。

    • -g3: 启用调试信息,-g3是GCC的一个调试级别选项,它会生成最全面的调试信息,方便使用调试器如GDB进行源代码级调试。

    • -pipe: 使用管道进行编译过程中的临时文件传输,这可以提高在具有足够内存和快速I/O系统的计算机上的编译速度。

    • -Wall: 开启所有警告(All warnings),这是告诉编译器尽可能多地报告可能的编译警告信息,有助于发现潜在的问题和不规范的编程习惯。

    综上所述,这条命令的作用就是使用G++编译器将UTF-8编码的C++源代码文件勾股.cpp编译成包含详细调试信息、采用GBK编码的可执行文件勾股.exe,并且在整个编译过程中启用所有警告提示。

目录.vscode中的相关文件说明

  • As you go through the tutorial, you will see three files created in a .vscode folder in the workspace:
    • tasks.json (build instructions)
    • launch.json (debugger settings)
    • c_cpp_properties.json (compiler path and IntelliSense settings)

tasks.json

  • tasks.json
    • 文档还介绍了如何去build多个cpp文件而不仅仅是一个cpp文件,比如build某个cpp所在目录内的所有cpp文件
    • 其中的args字段的配置是比较常用的

launch.json

  • Customize debugging with launch.json

c_cpp_properties.json

  • c_cpp_properties.json

IDE或编辑器配置

vscode配置

  • 重点是.vscode里面的3个文件

    • task.json
    • launch.json
    • c_cpp_properties.json
  • 详细的配置项目说明可以参考vscode的官方文档,通常只需要看c/c++ extension的这部分提到的简单配置即可

    • Get Started with C++ and MinGW-w64 in Visual Studio Code

相关指令和快捷键

  • commandshutcut(default)Notes
    Start DebuggingF5最常用的快捷键,一键编译运行源代码,并且可以设置支持打断点调试
    Tasks:Run Build Task仅编译源代码,可以得到编译后的可执行的二进制文件,但是不会运行,通常是作为Start Debugging的第一个步骤,比较少单独使用
    Debug:Select and Start Debugging选择一个debug方案,特别是您已经配置了多个方案时,
    Tasks:Config Default Build Task选择默认的task配置,为了适应不同的编译需要,用户在task.jsonlaunch.json中可以配置多个版本;可以从中选择一个最常用的配置
    Tasks:Config Task配置task,最后会跳转到tasks.json文件中的某一个tasks数组中的一个对象,每个对象对应一个task配置
  • 相关快捷键可以自行修改

  • 相关指令操作说明
    在这里插入图片描述我这里配置了3个task,为了名称简洁,以及方便引用,我把各个对象中的Label字段简单重名为task x的形式;
    您可以利用这个命令tasks:configure
    在这里插入图片描述command paletee中输入:Run C/C++ File
    在这里插入图片描述
    在这里插入图片描述
    tasks:run build task可以列出配置在tasks.json中的build task,(但是如果配置了默认task,可能不会列出全部的task);
    如果取消掉所有设置默认的task,就会列出所有tasks;
    选中其中的一个,可以启动编译,顺利的话会得到一个可执行二进制文件;
    在这里插入图片描述可以从command palette输入Debug:Select and Start Debugging进行选择debug方案
    在这里插入图片描述也可以找到侧边的按钮中得到列表内选择一个debug方案;
  • 如果刚刚配置好tasks.json,launch.json但是列表中没有显示出来对应的方案,可以尝试重载vscode窗口(或者重启vscode)

  • 如果始终没有,可能是配置文件(json)出错了

默认task配置和取消默认

  • tasks.json中的某个task中设置"group"对象

  • //配置默认的build task(注意不要多个task争抢默认build)
    // 非默认的task的"group"字段配置为:"group":"build",或考虑将"isDefault"设置为false
    "group": {
        "kind": "build",
        "isDefault": false //改为true就表示设置为默认
    },
    

配置文件

  • 下面我给出自己的配置,其特点是基本满足各种编译需求,适用于轻量的C/C++编译
  • 在讲具体配置内容之前,先了解以下内容
  • tasks.json中的tasks数组
    • 每个元素是一个对象,视为一个build task,分别表示一种build源代码的方案
    • 首先我的建议是取一个合适的task名字,在各个task对象的label字段中配置,名字可以设置的简单一些
      • 不需要担心命名太简单而看不出配置的用途,因为我们可以在detail字段中写入详细的信息
      • 将label字段设置的简单的好处在于launch.json中的preLaunchTask引用起来就方便,尽管您可以复制粘贴label字段的值代替手动输入到preLaunchTask字段😊
  • launch.json中的configurations数组
    • 每个元素是一个对象,可以视为一个launch方案,表示如何调试源代码(包括使用哪个调试器(debugger),要启动哪一个build task,调试时要传递什么参数给调试器等)
    • 这里最重要的除了配置正确的调试器路径,还要设置启动正确的task名称,这些名称从tasks.json中的label字段查找,比如我在tasks.json中配置了3种build task方案分别名为task1,task2,task3那么合法的名字就只有上述3个
    • 当然默认产生的task 的label一般是C/C++: g++.exe build active file,这个东西可以按照自己的喜好和方便使用的角度修改
    • launch.json中有name字段可以写得详细一些,因为我们不需要再引用这里的name字段了
    • name字段的值会显示在选择debug方案的列表中,供我们辨认不同的debug方案和选择
  • 最后c_cpp_properties.json文件,不是必须要的,但是如果有需要可以配置一些库的路径,编译标准版本等

使用vscode预置变量和环境变量

  • Visual Studio Code Variables Reference

  • Visual Studio Code(VS Code)支持在调试和任务配置文件以及某些特定设置中使用变量替换。这些变量通过 ${variableName} 语法在 launch.jsontasks.json 文件中的键值字符串内实现替换。

  • 用户环境变量和系统环境变量的引用:假设我配置了用户环境变量MSYS2_MINGW,并且确认了该值的有效性

    • PS> $env:MSYS2_MINGW
      C:\msys64\ucrt64\bin
      
    • PS[BAT:79%][MEM:32.00% (10.14/31.70)GB][22:02:08]
      # [C:\repos\C_CPP_ConsoleApps]
        ls $env:MSYS2_MINGW |where{$_.Name -like "gcc.*" -or $_.Name  -like "g++.*" -or $_.Name -like "gdb.*"}
      
              Directory: C:\msys64\ucrt64\bin
      
      
      Mode                LastWriteTime         Length Name
      ----                -------------         ------ ----
      -a---         2023/12/2      2:14        2721152 󰣆  g++.exe
      -a---         2023/12/2      2:14        2718592 󰣆  gcc.exe
      -a---         2023/12/4     21:52       10370879 󰣆  gdb.exe
      
    • 我在配置C/C++的试验中,发现引用环境变量仅在launch.json中是有效的

      • "miDebuggerPath": "${env:MSYS2_MINGW}\\gdb"
        
    • 然而,在tasks.json中引用环境变量是无效的

环境变量的使用

使用环境变量的好处
  • 如果将相关路径添加到Path路径中,那么就可以直接用名字gcc,g++,gdb来代替绝对路径

    • 无论是先配置MSYS2_MINGW,然后将MSYS2_MINGW添加到Path,或者直接将路径MSYS2_MINGW对应的值(我的例子是C:\msys64\ucrt64\bin)添加到Path变量中都可以
    • 如果是用户级别的环境变量,不需要管理员权限
    • 总之这个任务很简单,资料也很丰富,这里不赘述;但是配置了以后很有用
      • 命令行输入 SystemPropertiesAdvanced.exe或者开始菜单中输入 环境变量搜索就可以打开配置的控制面板,点击环境变量进行配置,用户级别和系统级别的Path任选其一将路径添加到Path变量中即可;
      • 老手也可以选择用命令行配置,比如setx,powershell还可以用 [Environment]::SetEnvironmentVariable()来配置
环境变量可能引起的问题
  • 生产环境的环境变量配置需要考虑的问题更多,配置环境变量虽然能够提供方便,但是可能引入潜在的混淆的机会
  • 但是对于学习环境,配置环境变量是方便和可行的,也是很平常的事情

检查编译器所在目录是否正确配置进Path变量

  • 上面的路径配置不是必须的,但确实很有用,可以带来便利的操作

  • 通过以下命令来检查是否配置成功

    gcc --version
    g++ --version
    gdb --version
    
    
    
  • PS[BAT:79%][MEM:34.73% (11.01/31.70)GB][22:07:20]
    # [C:\repos\scripts]
    PS> gcc --version
    gcc.exe (Rev3, Built by MSYS2 project) 13.2.0
    Copyright (C) 2023 Free Software Foundation, Inc.
    This is free software; see the source for copying conditions.  There is NO
    warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
    
    
    PS[BAT:79%][MEM:36.41% (11.54/31.70)GB][22:18:52]
    # [C:\repos\scripts]
    PS> g++ --version
    g++.exe (Rev3, Built by MSYS2 project) 13.2.0
    Copyright (C) 2023 Free Software Foundation, Inc.
    This is free software; see the source for copying conditions.  There is NO
    warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
    
    
    PS[BAT:79%][MEM:36.41% (11.54/31.70)GB][22:18:52]
    # [C:\repos\scripts]
    PS> gdb --version
    GNU gdb (GDB) 14.1
    Copyright (C) 2023 Free Software Foundation, Inc.
    License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
    This is free software: you are free to change and redistribute it.
    There is NO WARRANTY, to the extent permitted by law.
    
  • 上述命令各自没有报错,返回了各自的版本号,这说明配置是正确的

简化编译器,调试器的路径

  • 经过上述的Path变量配置,我们可以在vscode中得到以下效果
  • 可在任意终端中直接用gcc,g++,gdb来带直接调用相应的软件
  • 可以简化vscode中的相关配置(末尾的逗号是json中的不同字段的分割符)
    • tasks.json中的 "command": "C:\\msys64\\ucrt64\\bin\\g++.exe",可以简化为 "command": "g++",
    • launch.json中的"miDebuggerPath": "C:\\msys64\\ucrt64\\bin\\gdb.exe",简单用gdb来代替,即可以简化为"miDebuggerPath": "gdb",
  • 不仅如此,如果用的不是Msys2安装的gcc,g++,gdb而是其他方式安装的,比如直接用的MinGw安装的,那么我们也不需要去改动vscode中的配置文件,只需修改一下Path环境变量中gcc,g++,gdb的所在目录即可(通常这三个组件都是同一个目录)

C/C++共用一组tasks.json/launch.json文件?

  • 您可以考虑vscode中新建工作区,来分别配置.vscode中的相关文件
  • 也可以让c/c++共用一组配置文件,但是json文件里的task,等可以相对独立,因此也是可以考虑两种语言的build task 和debug方案配置在同一组文件中

关于注释

  • 在json文件中编写注释是不可靠的

  • 顶多是创建一个comment字段或者description,或者detail字段,然后将注释字符串写入到该字段的值下

  • 另一方面,使用vscode command palette配置tasks.json等文件时,可能会清空掉所有//引出的注释,从而导致注释丢失

内容示例👺

  • 下面的两个配置文件是经过一定的实践,能够良好并相对舒适得工作
  • 如果vscode变动不大,那么直接复制粘贴到自己的C/C++ vscode工程目录中也是可以的
tasks.json内容示例
  • {
        "tasks": [
            {
                "type": "cppbuild",
                "label": "task1",
                "command": "g++.exe",
                "args": [
                    "-fdiagnostics-color=always",
                    "-g",
                    "*.cpp", //如果要编译多个c文件,将*.cpp改为*.c;而在这个文件里我另外配了一个task1c,来对*.c文件执行类似的功能
                    "-o",
                    "${fileDirname}\\All.exe"
                ],
                "options": {
                    "cwd": "${fileDirname}"
                },
                "problemMatcher": [
                    "$gcc"
                ],
                //配置默认的build task(注意不要多个task争抢默认build)
                // 非默认的task的"group"字段配置为:"group":"build",或考虑将"isDefault"设置为false
                "group": {
                    "kind": "build",
                    "isDefault": false //改为true就表示设置为默认
                },
                "detail": "build  C++ language files(*.cpp) in the ${fileDirname} directory (not c files) "
            },
            {
                "type": "cppbuild",
                "label": "task1c",
                "command": "g++.exe",
                "args": [
                    "-fdiagnostics-color=always",
                    "-g",
                    "*.c",
                    "-o",
                    "${fileDirname}\\All.exe"
                ],
                "options": {
                    "cwd": "${fileDirname}"
                },
                "problemMatcher": [
                    "$gcc"
                ],
                "group": "build",
                "detail": "build C language files(*.c) in the ${fileDirname} directory (rather than c++ files,this is a fork of task1)"
            },
            {
                "type": "cppbuild",
                "label": "task2",
                "command": "g++.exe",
                "args": [
                    "-fdiagnostics-color=always",
                    "-g",
                    "${file}", //编译当前打开(active状态,鼠标点击后)的源文件,无法分辨是否为c/c++源代码,因此如果用这个配置来编译其他语言的源代码会出错!或说回来一个简单工程目录文件中通常只有一种语言,但是复杂项目则往往有多种语言代码文件,这时候要小心配置并选择合适的build task,以及后续的debug配置
                    "-o",
                    "${fileDirname}\\a.exe"
                ],
                "options": {
                    "cwd": "${fileDirname}"
                },
                "problemMatcher": [
                    "$gcc"
                ],
                "group": "build",
                "detail": "build active file(c/c++),output a.exe  (For Englis, Chinese characters and other non-English characters)."
            },
            {
                "type": "cppbuild",
                "label": "task3",
                "command": "g++.exe",
                "args": [
                    "-fdiagnostics-color=always",
                    "-g",
                    "${file}",
                    "-o",
                    "${fileDirname}\\${fileBasenameNoExtension}.exe",
                    // "-finput-charset=UTF-8",
                    // "-fexec-charset=gbk"
                ],
                "options": {
                    "cwd": "${fileDirname}"
                },
                "problemMatcher": [
                    "$gcc"
                ],
                "group": "build",
                "detail": "Task generated by Debugger(Default). This is not compatible with Chinese characters or other non-English characters."
            }
        ],
        "version": "2.0.0"
    }
    
launch.json内容示例
  • {
        "version": "0.2.0",
        "configurations": [
            // 对于一个脚本和C++控制台小程序的工作区,可以存放多种编程语言源文件,比如可以将python的调试配置也可以放进来,和C/C++的debug方案放在一起,充当configurations数组的元素,这样一个工作区可以通过选择包含在本文件的不同的配置来调试不同语言的程序
            // {
            //     "name": "Python Debugger: Current File",
            //     "type": "debugpy",
            //     "request": "launch",
            //     "program": "${file}",
            //     "console": "integratedTerminal"
            // },
            {
                "name": "C/C++: g++.exe build and debug the C++ language files",
                "type": "cppdbg",
                "request": "launch",
                // "program": "${fileDirname}\\${fileBasenameNoExtension}.exe",
                "program": "${fileDirname}\\All.exe",
                "args": [],
                "stopAtEntry": false,
                "cwd": "${fileDirname}",
                "environment": [],
                "externalConsole": false,
                "MIMode": "gdb",
                // "miDebuggerPath": "${env:MSYS2_MINGW}\\gdb.exe",
                "miDebuggerPath": "gdb",
                "setupCommands": [
                    {
                        "description": "Enable pretty-printing for gdb",
                        "text": "-enable-pretty-printing",
                        "ignoreFailures": true
                    },
                    {
                        "description": "Set Disassembly Flavor to Intel",
                        "text": "-gdb-set disassembly-flavor intel",
                        "ignoreFailures": true
                    }
                ],
                // "preLaunchTask": "C/C++: g++.exe build active file"
                "preLaunchTask": "task1"
            },
            {
                "name": "C/C++: g++.exe build and debug the C language files",
                "type": "cppdbg",
                "request": "launch",
                "program": "${fileDirname}\\All.exe",
                "args": [],
                "stopAtEntry": false,
                "cwd": "${fileDirname}",
                "environment": [],
                "externalConsole": false,
                "MIMode": "gdb",
                "miDebuggerPath": "gdb",
                "setupCommands": [
                    {
                        "description": "Enable pretty-printing for gdb",
                        "text": "-enable-pretty-printing",
                        "ignoreFailures": true
                    },
                    {
                        "description": "Set Disassembly Flavor to Intel",
                        "text": "-gdb-set disassembly-flavor intel",
                        "ignoreFailures": true
                    }
                ],
                "preLaunchTask": "task1c"
            },
            {
                "name": "C/C++: g++.exe build and debug active file(For English, Chinese characters and other non-English characters)",
                "type": "cppdbg",
                "request": "launch",
                // "program": "${fileDirname}\\${fileBasenameNoExtension}.exe",
                "program": "${fileDirname}\\a.exe",
                "args": [],
                "stopAtEntry": false,
                "cwd": "${fileDirname}",
                "environment": [],
                "externalConsole": false,
                "MIMode": "gdb",
                "miDebuggerPath": "gdb",
                "setupCommands": [
                    {
                        "description": "Enable pretty-printing for gdb",
                        "text": "-enable-pretty-printing",
                        "ignoreFailures": true
                    },
                    {
                        "description": "Set Disassembly Flavor to Intel",
                        "text": "-gdb-set disassembly-flavor intel",
                        "ignoreFailures": true
                    }
                ],
                "preLaunchTask": "task2"
            },
            {
                "name": "C/C++: g++.exe build and debug active file",
                "type": "cppdbg",
                "request": "launch",
                "program": "${fileDirname}\\${fileBasenameNoExtension}.exe",
                "args": [],
                "stopAtEntry": false,
                "cwd": "${fileDirname}",
                "environment": [],
                "externalConsole": false,
                "MIMode": "gdb",
                "miDebuggerPath": "gdb",
                "setupCommands": [
                    {
                        "description": "Enable pretty-printing for gdb",
                        "text": "-enable-pretty-printing",
                        "ignoreFailures": true
                    },
                    {
                        "description": "Set Disassembly Flavor to Intel",
                        "text": "-gdb-set disassembly-flavor intel",
                        "ignoreFailures": true
                    }
                ],
                "preLaunchTask": "task3"
            }
        ]
    }
    

参考的仓库😊

  • C_CPP_ConsoleApps: (gitee.com)
  • 您可以在命令行内git clone https://gitee.com/xuchaoxin1375/C_CPP_ConsoleApps.git
  • 这会拉去一个简单的仓库,里面的vscode配置是基于Msys2
  • 如果您安装的也是Msys2的windows GCC环境,并且是默认路径,那么clone下来的仓库内编写的c/c++代码就可以直接运行
    • 前提是要安装vscode上的c/c++ extension package
    • 同时把g++,gdb,gcc所在目录配置到环境变量Path中去
    • 那么不出意外就可以在仓库目录内编写和试验c++代码了
  • 如果您使用的是MinGw,那么修改相应的g++,gdb路径也可以
编译和调试选项
  • 最后,要注意编译运行单个C/C++代码文件通常选用task2的配置
    • 如果要运行的程序被拆分为单个或多个C++源代码文件,他们被组织在各自的目录里面且不包含其他程序的源文件,那么使用task1来编译并运行或调试(如果是C源代码,那么使用task1c)
    • 如果您的习惯是不同程序的源代码都放到同一个目录,那么使用task2比较合适
      • 其限制是每个程序只能存放在一个c/c++文件中(.h头文件除外),否则拆分到多个.c/.cpp文件task2识别不了到底哪几个源文件是构成同一个程序,哪些又是不需要参与编译的原文件
    • task3是默认的配置,可以编译单个英文名字的c/c++源代码文件,对于中文名字的源代码来说就不友好了,容易报错
  • 总的来说,练习OJ题目或者Leetcode题目,使用task2来编译,c/c++通吃
  • 多文件并且按程序相关性把源文件组织到各自的目录中时,用task1task1c编译
  • task3是默认的,对中文不友好,可以不用
  • 另一方面也可以灵活切换编译配置,比如目录mix/下是一堆相互独立,或者完全不相关的c/c++源代码文件,他们可能各自都是一个完整的程序源代码,此时把编译模式切换到task2
  • 反之,假设目录demos里面包含了许多文件夹,每个文件夹里各表示一个程序,里面将一个程序的源代码拆分为多份,那么用task1task1c去编译
  • 当然通常我们用launch.json来配置编译和调试(build and debug)一条龙,而不是直接用tasks.json来直接编译
  • 因此您可以选择command palette中输入debug: select and start debugging选择一个方案进行编译调试(我提供的仓库已经组织好了,配置了几种模式)

编译中文环境下的源代码文件相关问题

  • 根据官方文档的教程,配置后可以良好的编译和调试纯英文下的C++/C程序
  • 对于国内用户来说,经常会将文件命名为中文,或者源代码中充斥了大量的中文注释
  • 尽管我们提倡在代码中尽可能使用英文,但是对于部分用来说这个要求有点高
  • 因此我们还需要解决vscode中编译和调试中文名的C++程序会乱码的问题

FAQ

编译多个源文件😊

  • task.json和launch.json分别负责控制编译和调试

  • 通常简单的需求只需要在默认生成的文件内稍作修改就可以工作

  • 然而对于稍微复杂的编译需求,我们需要进一步的配置

    • 比如配置能够编译/调试多个源文件的情况
    • 配置能够编译/调试中文源文件的情况
源文件组织
  • 通常我们将同一个程序(源代码分散到了多个不同源文件)的相关源文件存放到同一个目录中,而其他程序的源文件就不要混进来,这样不利于管理和一键编译的配置
  • 换句话说,假设您将多个相互独立(或者没有关系的)源文件放到同一个目录,那么一口气将它编译链接就会出问题
    • 尽管我们可以用命令行手动选择要编译哪些源文件,但是不利于我们配置task.json进行一键编译
    • 所以这里强调同一个程序有多个源文件时要组织到一个单独的目录中去,并且不要参杂其他程序源文件

编译出的可执行文件名中文乱码😊

  • 实验发现,对于文件名为中文的C++/C语言源代码编译时得到的.exe文件名会是乱码

  • 这就导致launch.json中默认配置的调试语句找不到编译后的可执行文件,导致调试报错无法进行下去

  • 对于简单控制台程序,从实践的角度,通常我们希望编写玩一个c++程序,然后可以一键编译运行或调试,就可以了

  • 当然最好能够兼容中文名源文以及英文名源文件

  • 现在的问题是遇到中文名源文件,windows上的Gcc(Mingw或其他移植Gcc)的项目编译中文名c++文件在不同场景下有不同的效果

    • PS[BAT:69%][MEM:42.83% (13.58/31.70)GB][21:01:23]
      # [C:\repos\C_CPP_ConsoleApps]
       g++ .\勾股.cpp -o 勾股.exe
      
      PS[BAT:69%][MEM:42.79% (13.56/31.70)GB][21:01:48]
      # [C:\repos\C_CPP_ConsoleApps]
       ls *.exe
      
              Directory: C:\repos\C_CPP_ConsoleApps
      
      
      Mode                LastWriteTime         Length Name
      ----                -------------         ------ ----
      -a---         2024/4/24     21:01         140467 󰣆  勾股.exe
      
      
      
    • 上述试验说明,在命令行中手动调用g++来编译没有没有出现文件名乱码的结果

    • 但是执行的时候可能会输出程序内部带出来的中文乱码,我们可以追加参数-finput-charset=UTF-8 -fexec-charset=gbk

  • 示例

    • PS[BAT:79%][MEM:46.76% (14.82/31.70)GB][22:09:28]
      # [C:\repos\C_CPP_ConsoleApps]
       cat  C:\repos\C_CPP_ConsoleApps\cpp\helloworld.cpp
      #include <iostream>
      #include <vector>
      #include <string>
      #include <iostream>
      #include <windows.h> // For system("pause")
      using namespace std;
      
      int main()
      {
          vector<string> msg{"Hello", "C++", "World", "from", "VS Code", "and the C++ extension!"};
          int i=0;
          for (const string &word : msg)
          {
              ++i;
              cout << word  << " ";
          }
          cout << endl;
          cout << "中文会乱码吗?"<<endl;
      }
      
    • PS[BAT:79%][MEM:46.74% (14.82/31.70)GB][22:08:42]
      # [C:\repos\C_CPP_ConsoleApps]
       gcc c:\repos\C_CPP_ConsoleApps\cpp\helloworld.cpp -o demo.exe -lstdc++ -finput-charset=UTF-8 -fexec-charset=gbk
      #或者  g++ .\helloworld.cpp -o demo.exe -finput-charset=UTF-8 -fexec-charset=gbk
      
      PS[BAT:79%][MEM:46.79% (14.83/31.70)GB][22:08:53]
      # [C:\repos\C_CPP_ConsoleApps]
       .\demo.exe
      Hello C++ World from VS Code and the C++ extension!
      中文会乱码吗?
      
  • 然而,vscode中匹配了tasks.json和launch.json进行一键编译运行时确发生了二进制文件中文名称乱码的情况

修改tasks.json和launch.json

  • 文档中指出,我们可以通过配置

    • tasks.json中的编译选项(-o后的值(编译结果)为英文硬编码,比如a.exe)

      • "args": [
            "-fdiagnostics-color=always",
            "-g",
            "${file}",
            "-o",
            "${fileDirname}\\a.exe" //修改这里,默认的值为"${fileDirname}\\${fileBasenameNoExtension}.exe"
        ],
        
    • 然后再配置launch.json中的program字段

      • "program": "${fileDirname}\\a.exe",
    • 也就是编译出来的名字总是命名为a.exe,然后调试时找的也是同目录下的a.exe,避开了中文可能导致的乱码,导致调试器找不到对应的可执行文件报错

  • 上述操作虽然没有正面解决中文文件名乱码问题,但是已经能够让我们比较舒服的使用vscode来学习C/C++编程和算法,能够一键编译和运行/调试代码,甚至可以配置一键编译分散在多个源文件的程序,中文文件名确实也不报错了,基础阶段非常够用

  • 如果确实需要所有编译出来的可执行文件,那么写个脚本就行

早期使用MinGw配置Vscode的C/C++编程环境的探索

  • 早期的实践,操作比较稚嫩,有缘可能会回去改改:链接在此浏览 (csdn.net)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/579951.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【树莓派】树莓派4B配置环境

当你在配置你的系统时&#xff0c;这些指令将会非常有用。首先&#xff0c;你可能需要设置代理&#xff0c;特别是当你在一个受限的网络环境下工作时。以下是一些指令的详细说明&#xff1a; 设置代理 export http_proxyhttp://192.168.3.2:10811 export https_proxyhttp://1…

冰箱主控 32位MCU,多通道、高精度的AD采样配合温度传感器,实现冰箱各温室的精确控温;低功耗设计

概览 小华高性价比32位MCU&#xff0c;多通道、高精度的AD采样配合温度传感器&#xff0c;实现冰箱各温室的精确控温&#xff1b;低功耗设计&#xff0c;绿色低碳、节能环保&#xff1b;模块化设计&#xff0c;充分利用丰富的通讯接口&#xff0c;使主控板、显示板和驱动板灵活…

贝叶斯(Bayes)法则

1.生活中的贝叶斯 学概论统计或者机器学习经常都会提到贝叶斯法则&#xff0c;它到底是个啥&#xff0c;让我们一起看看。在生活中我们都会对人或者事物有一个非常主观的判断&#xff0c;这个主观的判断的基础是我们的生活经历总结出来的经验。先来两个例子&#xff1a; One&a…

加速博客体验:静态资源优化技巧大揭秘!

如今有许多人涉足博客写作&#xff0c;其中大多数正处于博客创作的旅程中。每位程序员都梦想拥有自己的服务器&#xff0c;理想情况下&#xff0c;服务器配置越高越好&#xff0c;价格越实惠越好。购买一台基础款服务器用于建立博客是一个不错的选择&#xff0c;因为并不需要处…

Date类.Java

目录 1.1Date概述 1.2Date常用方法 1.2.1 日期比较 2.1SimpleDateFormat类 1. 基本概念 2.构造方法 2.1格式规则&#xff1a; 3.成员方法 3.1格式化日期和时间 3.2解析日期和时间 4.练习1(出生日期&#xff09; 5.练习2(秒杀活动) 1.1Date概述 util里面的Data类…

K8s 使用 CephFS 作为后端存储(静态供给、动态供给)

一、K8s 使用 CephFS CephFS是 Ceph 中基于RADOS&#xff08;可扩展分布式对象存储&#xff09;构建&#xff0c;通过将文件数据划分为对象并分布到集群中的多个存储节点上来实现高可用性和可扩展性。 首先所有 k8s 节点都需要安装 ceph-common 工具&#xff1a; yum -y ins…

项目进度规划全攻略,助你成为项目管理高手

项目进度管理作为项目管理中的核心环节&#xff0c;对于确保项目按时交付、控制成本和提高质量至关重要。本文将详细介绍项目进度管理的基本步骤&#xff0c;帮助项目经理和团队成员更好地理解和执行进度管理工作。 项目进度管理的基本步骤主要包括以下几个方面&#xff1a; …

236基于matlab的三维比例导引法仿真

基于matlab的三维比例导引法仿真&#xff0c;可以攻击静止/机动目标。1.三维空间内的比例导引程序&#xff0c;采用龙哥库塔积分法&#xff1b;2.文件名为bili3dnew的.m文件是主函数&#xff0c;执行时需调用目标机动子函数、导引律子函数、数值积分法子函数&#xff1b;3.文件…

微服务之并行与分布式计算

一、概述 1.1集中式系统vs分布式系统 集中式系统 集中式系统完全依赖于一台大型的中心计算机的处理能力&#xff0c;这台中心计算机称为主机&#xff08;Host 或 mainframe &#xff09;&#xff0c;与中心计算机相连的终端设备具有各不相同非常低的计算能力。实际上大多数终…

《ESP8266通信指南》8-连接WIFI(Arduino开发)(非常简单)

往期 《ESP8266通信指南》7-Arduino 开发8266的环境配置与示例代码烧录-CSDN博客 《ESP8266通信指南》6-创建TCP服务器&#xff08;AT指令&#xff09;-CSDN博客 《ESP8266通信指南》5-TCP通信透传模式(AT指令)-CSDN博客 《ESP8266通信指南》4-以Client进行TCP通信&#xf…

弹性盒之主轴侧轴对齐方式

弹性盒设置主侧轴对齐方式 1.默认 justify-content: flex-start 2.justify-content: flex-end 3.justify-content: center 4.justify-content: space-between; 两端对齐 5.justify-content: space-around; 距离环绕 调整侧轴上中下 1.默认align-items: flex-start; …

论机器学习(ML)在网络安全中的重要性

机器学习是什么&#xff1f; 机器学习(ML)是人工智能的一个分支&#xff0c;它使用算法来使计算机系统能够自动地从数据和经验中进行学习&#xff0c;并改进其性能&#xff0c;而无需进行明确的编程。机器学习涉及对大量数据的分析&#xff0c;通过识别数据中的模式来做出预测…

在MySQL中isnull()函数不能作为替代null值!

在MySQL中isnull()函数不能作为替代null值&#xff01; 如下&#xff1a; 首先有个名字为business的表&#xff1a; SELECT ISNULL(business_name,no business_name) AS bus_isnull FROM business WHERE id2 直接运行就会报错&#xff1a; 错误代码&#xff1a; 1582 Incor…

5本On Hold,6本预警被踢,学术诚信高风险期刊被踢9本,还剩1本你还敢投吗?

本周投稿推荐 SSCI • 2/4区经管类&#xff0c;2.5-3.0&#xff08;录用率99%&#xff09; SCIE&#xff08;CCF推荐&#xff09; • 计算机类&#xff0c;2.0-3.0&#xff08;最快18天录用&#xff09; SCIE&#xff08;CCF-C类&#xff09; • IEEE旗下&#xff0c;1/2…

禅道项目管理系统身份认证绕过漏洞

禅道项目管理系统身份认证绕过漏洞 1.漏洞描述 禅道项目管理软件是国产的开源项目管理软件&#xff0c;专注研发项目管理&#xff0c;内置需求管理、任务管理、bug管理、缺陷管理、用例管理、计划发布等功能&#xff0c;完整覆盖了研发项目管理的核心流程。 禅道项目管理系统…

如何使用 Internet Download Manager (IDM) 来加速和优化你的下载体验 IDM 6.41下载神器

在当今信息爆炸的时代&#xff0c;下载文件和媒体内容已成为我们日常生活的一部分。无论是工作学习还是娱乐休闲&#xff0c;我们都需要从互联网上下载各种资源。为了提高下载效率和确保文件完整性&#xff0c;选择一款优秀的下载管理软件至关重要。Internet Download Manager …

PotatoPie 4.0 实验教程(21) —— FPGA实现摄像头图像二值化(RGB2Gray2Bin)

PotatoPie 4.0开发板教程目录&#xff08;2024/04/21&#xff09; 为什么要进行图像的二值化&#xff1f; 当我们处理图像时&#xff0c;常常需要将其转换为二值图像。这是因为在很多应用中&#xff0c;我们只对图像中的某些特定部分感兴趣&#xff0c;而不需要考虑所有像素的…

JavaScript 中的IF判断竟然可以这样写,效率更高

当然&#xff0c;它们是创建控制流的一种简单而方便的方式&#xff0c;但你可以写下数十亿行条件性的 JavaScript 代码&#xff0c;而不需要一个 if 语句。 而且有很多情况下&#xff0c;使用不同的结构会更清晰地展示你想要做的事情 —— 只要我们还在为人类编写代码&#xf…

深度学习系列65:数字人openHeygen详解

1. 主流程分析 从inference.py函数进入&#xff0c;主要流程包括&#xff1a; 1&#xff09; 使用cv2获取视频中所有帧的列表&#xff0c;如下&#xff1a; 2&#xff09;定义Croper。核心代码为69行&#xff1a;full_frames_RGB, crop, quad croper.crop(full_frames_RGB)。…

基于springboot+vue+Mysql的乐校园二手书交易管理系统

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…
最新文章