• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
LOFLY
终其一生,编织快乐
博客园    首页    新随笔    联系   管理    订阅  订阅

二、使用VS Code编写C++代码 进阶(下)

使用VS Code编写C++代码 进阶(下)

二、使用VS Code编写C++代码 进阶(下)

使用cmake编译项目文件。

  • 基于cmake
    • 编写最简单的CMakeLists.txt
    project(MYSWAP)
    add_executable(my_cmake_swap,main.cpp swap.cpp)
    
    • 进行多文件编译并调试
    mkdir build
    cd build
    # 如果电脑上已经安装了VS,可能会调用微软 MSVC编译器,使用(cmake -G "MinGW Makefiles" ..)代替(cmake ..)即可
    # 仅一次使用cmake时使用(cmake -G "MinGW Makefiles" ..) 后面可使用(cmake ..)
    cmake ..
    mingw32-make.exe
    
  • 配置json
    • launch.json -- for debug
    • tasks.json -- for build before debug

cmake可以生成makefile,makefile可以指定编译规则,但makefile很难手工去写。所以cmake工具可以自动生成makefile文件。如果要使用cmake工具来构建项目,
首先在目录下新建一个文件CMakeLists.txt.
image

image

如何通过cmake生成可执行文件?在操作之前需要对cmake进行额外的配置:
进入命令面板(Ctrl+Shift+P),
image
选择编译器
image
image
image
回到终端,进入build文件夹下:
image

image

image
生成了可执行文件my_cmake_swap.exe文件。
image

生成的可执行文件的位置:
image

如何进行调试呢?
进入lanuch.json文件进行配置。
image
修改后的program值:
"program": "${workspaceFolder}/build/my_cmake_swap.exe"
preLaunchTask值先注释。
修改后的launch.json文件的内容如下:

{
    // 使用 IntelliSense 了解相关属性。 
    // 悬停以查看现有属性的描述。
    // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "g++.exe - 生成和调试活动文件",
            "type": "cppdbg",
            "request": "launch",
            "program": "${workspaceFolder}/build/my_cmake_swap.exe", // 代表要调试的可执行文件
            "args": [],
            "stopAtEntry": false,
            "cwd": "${workspaceFolder}",
            "environment": [],
            "externalConsole": false, // false表示在终端输出  true表示新生成一个cmd窗口输出
            "MIMode": "gdb",
            "miDebuggerPath": "D:\\application\\minGW\\mingw64\\bin\\gdb.exe",
            "setupCommands": [
                {
                    "description": "为 gdb 启用整齐打印",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                },
                {
                    "description": "将反汇编风格设置为 Intel",
                    "text": "-gdb-set disassembly-flavor intel",
                    "ignoreFailures": true
                }
            ],
            // "preLaunchTask": "C/C++: g++.exe 生成活动文件" // 调试前执行的任务,一般为编译程序。与tasks.json的label相对应
        }
    ]
}

回到main.cpp文件,设置断点,按F5启动调试。
上面程序运行过程中,我们并没有使用到mkdir build命令。这个命令可以自己去建立一个build文件夹,而不需要等系统去创建。
image

下面演示,手动创建build文件夹。在终端的工程路径下输入指令mkdir build.
image

image
这里会出现一个问题:
image
解决方案:使用cmake -G "MinGW Makefiles" .. 代替 cmake ..
image
image

如果按F5会发现,并不能断点调试,这是因为系统默认的cmake ..不包含调试信息,需要使用cmake ..-DCMAKE_BUILD_TYPE=Debug


下面详细看launch.json文件:

{
    // 使用 IntelliSense 了解相关属性。 
    // 悬停以查看现有属性的描述。
    // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "g++.exe - 生成和调试活动文件",
            "type": "cppdbg",
            "request": "launch",
            "program": "${workspaceFolder}/build/my_cmake_swap.exe", // 代表要调试的可执行文件
            "args": [],
            "stopAtEntry": false,
            "cwd": "${workspaceFolder}",
            "environment": [],
            "externalConsole": false, // false表示在终端输出  true表示新生成一个cmd窗口输出
            "MIMode": "gdb",
            "miDebuggerPath": "D:\\application\\minGW\\mingw64\\bin\\gdb.exe",
            "setupCommands": [
                {
                    "description": "为 gdb 启用整齐打印",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                },
                {
                    "description": "将反汇编风格设置为 Intel",
                    "text": "-gdb-set disassembly-flavor intel",
                    "ignoreFailures": true
                }
            ],
            // "preLaunchTask": "C/C++: g++.exe 生成活动文件" // 调试前执行的任务,一般为编译程序。与tasks.json的label相对应
        }
    ]
}

当对源代码进行修改时,由于上面launch.json文件中的"preLaunchTask": "C/C++: g++.exe 生成活动文件" 注释掉了,所以再次进行调试,就不会对源码重新编译了。 所以为了修改源代码时, 按F5时, 能够自动匹配修改的程序,所以要讲注释给打开。
但是按F5后,无法进行调试。
image
说明系统中没有名称为C/C++: g++.exe 生成活动文件的task,所以在task.json文件中,讲label值改为C/C++: g++.exe 生成活动文件。默认生成的tasks.json是单文件调试,
改过后的tasks.json文件如下图所示:

{
    "tasks": [
        {
            "type": "cppbuild",
            "label": "C/C++: g++.exe build active file",
            "command": "D:\\application\\minGW\\mingw64\\bin\\g++.exe",
            "args": [
                "-fdiagnostics-color=always",
                "-g",
                "main.cpp",
                "swap.cpp",
                "-o",
                "${fileDirname}/build/my_cmake_swap.exe"
            ],
            "options": {
                "cwd": "${workspaceFolder}"
            },
            "problemMatcher": [
                "$gcc"
            ],
            "group": {
                "kind": "build",
                "isDefault": true
            },
            "detail": "调试器生成的任务。"
        }
    ],
    "version": "2.0.0"
}

改过后的launch.json文件如下图所示:

{
    // 使用 IntelliSense 了解相关属性。 
    // 悬停以查看现有属性的描述。
    // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "g++.exe - 生成和调试活动文件",
            "type": "cppdbg",
            "request": "launch",
            "program": "${workspaceFolder}/build/my_cmake_swap.exe", // 代表要调试的可执行文件
            "args": [],
            "stopAtEntry": false,
            "cwd": "${workspaceFolder}",
            "environment": [],
            "externalConsole": false, // false表示在终端输出  true表示新生成一个cmd窗口输出
            "MIMode": "gdb",
            "miDebuggerPath": "D:\\application\\minGW\\mingw64\\bin\\gdb.exe",
            "setupCommands": [
                {
                    "description": "为 gdb 启用整齐打印",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                },
                {
                    "description": "将反汇编风格设置为 Intel",
                    "text": "-gdb-set disassembly-flavor intel",
                    "ignoreFailures": true
                }
            ],
            "preLaunchTask": "C/C++: g++.exe build active file" // 调试前执行的任务,一般为编译程序。与tasks.json的label相对应
        }
    ]
}

补充: cmake ..的含义:cmake .. 使用 ../CMakeLists.txt 文件作为起始点在当前目录中生成makefile。

posted @ 2022-08-11 22:36  编织快乐  阅读(201)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3