二、使用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.
如何通过cmake生成可执行文件?在操作之前需要对cmake进行额外的配置:
进入命令面板(Ctrl+Shift+P),
选择编译器
回到终端,进入build文件夹下:
生成了可执行文件my_cmake_swap.exe文件。
生成的可执行文件的位置:
如何进行调试呢?
进入lanuch.json文件进行配置。
修改后的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文件夹,而不需要等系统去创建。
下面演示,手动创建build文件夹。在终端的工程路径下输入指令mkdir build.
这里会出现一个问题:
解决方案:使用cmake -G "MinGW Makefiles" .. 代替 cmake ..
如果按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后,无法进行调试。
说明系统中没有名称为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。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek “源神”启动!「GitHub 热点速览」
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· NetPad:一个.NET开源、跨平台的C#编辑器