目录
前言
注意
绝对不要有中文路径,不然可能有奇怪的bug
在VSCode
编写代码的时候,如果要实现编译操作,需要配置编译器环境–MinGW
。
而需要构建项目的话则要用到CMake
,这三者结合才能开发C语言或者C++的项目。
本篇文章暂时不介绍CMake和使用命令行,主要介绍使用图形化界面操作以及配置json文件来实现编译生成调试。
插件的安装
首先需要安装一些插件
编译器系统MinGW
MinGW
MinGW是一款在Windows平台上模拟UNIX开发环境的免费GNU工具集
,它允许用户在Windows上使用类似于Unix/Linux环境下的GNU工具,包括GCC编译器等,进而使用GCC编译器进行C语言程序的编译。MinGW的全称是“Minimalist GNU for Windows”,是一套GNU工具集合
,包括免费的Windows使用的头文件和库文件,还有程序开发工具,例如gcc、g++、make等 ,使得在Windows上进行C语言开发成为可能。
总之,MinGW(Minimalist GNU for Windows)是一个在Windows平台上的工具集合,MinGW项目提供了一套简单方便的Windows下的基于GCC程序开发环境。
GNU
GNU是一个自由的操作系统,其全称为"GNU’s Not Unix!",是一个递归缩写词。GNU工程由Richard Stallman在1983年发起,旨在创建一个完全自由的操作系统,包括内核、编译器、编辑器、桌面系统、应用程序等整个软件生态
。GNU工程的目标是构建一个类似Unix的操作系统,使用户能够自由地运行、复制、发布、研究、修改和改进软件.
GNU工程开发了许多重要的软件包,例如Emacs编辑器、GCC编译器集合、GDB调试器等
。然而,GNU工程最初并没有自己的内核,直到1991年Linus Torvalds开发了Linux内核,并在1992年与GNU软件结合,形成了完全自由的操作系统,通常被称为"GNU/Linux"或简称Linux
总的来说,GNU是一个自由的操作系统项目,通过与Linux内核的结合,形成了广泛使用的GNU/Linux操作系统
。GNU工程的目标是为用户提供完全自由的软件,推动自由软件运动的发展。
MinGW-w64
MinGW-w64是MinGW的一个变种,它不仅支持32位程序的编译,还支持64位程序的编译。MinGW-w64提供了对最新C语言标准的编译支持,并且由于其开源的特性,拥有一个活跃的社区进行持续维护。
GCC
GCC(GNU Compiler Collection):一个开源的编译器套件,支持多种编程语言,包括C、C++、Fortran等,在MinGW中被用来编译和生成Windows平台下的可执行文件。
CMake
CMake是一个跨平台的自动化构建系统,它使用配置文件(CMakeLists.txt)来生成标准的构建文件,如Unix的Makefile或Windows的Visual Studio工程文件。CMake支持多种编程语言,并且可以与多种编译器和构建工具配合使用。
以下是CMake的一些关键特性
:
-
跨平台:CMake可以在Windows、Linux、macOS等多种操作系统上运行,并且可以生成对应平台的构建系统。
-
易于使用:CMake使用一种名为CMakeLists.txt的简单脚本语言来描述项目结构和构建过程。
-
可定制:用户可以自定义CMake的构建过程,包括编译选项、链接库、目标文件等。
-
编译器无关性:CMake本身不依赖于特定的编译器,它可以与GCC、Clang、MSVC等编译器一起使用。
-
第三方库支持:CMake支持查找和使用第三方库,简化了依赖管理。
-
测试驱动:CMake支持CTest,这是一个测试驱动程序,可以用来运行项目中的测试用例。
-
包管理系统:CMake可以使用CPack来生成二进制或源代码包,方便软件的分发。
使用CMake的基本流程通
常包括以下几个步骤:
- 编写CMakeLists.txt文件,定义项目结构和构建规则。
- 使用cmake命令生成构建系统,例如Makefile或IDE工程文件。
- 使用生成的构建系统编译和链接项目,生成可执行文件或库文件。
CMake的灵活性和跨平台特性使其成为许多开源项目和大型软件项目的首选构建系统。
网上有很多关于配置CMake和MingGW的系统环境等系统配置的视频了,这里不赘述,主要关注如何调试、编译多文件。后续文章再介绍CMake。
参考配置教程
---------------------------------------------
设置C的编译选项
参考视频
打开VScode工程文件并写好代码之后,如果想要编译代码需要先配置编译选项。
打开命令面板,在 查看V - 打开命令面板
- 点击完之后,项目工程根目录下会生成.vscode文件夹
- 同时主界面会弹出 C/C++ Configuration 用以配置编译器路径等设置
配置编译器路径
更改完之后它提示智能代码提示也需要更改,也就是IntelliSense模式
IntelliSense模式
我的电脑是64位,所以选择gcc-x64
- 配置好之后c_cpp_properties.json文件就是下面这样
{
"configurations": [
{
"name": "Win32",
"includePath": [
"${workspaceFolder}/**"
],
"defines": [
"_DEBUG",
"UNICODE",
"_UNICODE"
],
"windowsSdkVersion": "10.0.19041.0",//windows sdk版本
"compilerPath": "C:/Program Files/mingw64/bin/gcc.exe",//编译器路径 gcc
"cStandard": "c17",//c标准
"cppStandard": "c++17",//c++标准
"intelliSenseMode": "gcc-x64"//智能代码提示模式
}
],
"version": 4
}
创建执行任务:task.json
要编译和执行构建任务,需要配置task.json
终端-配置任务
- 点击之后会自动生成task.json配置文件
{
"version": "2.0.0",
"tasks": [
{
"type": "cppbuild",
"label": "C/C++: gcc.exe 生成活动文件",
"command": "C:/Program Files/mingw64/bin/gcc.exe",//指定编译器
"args": [
"-fexec-charset=GBK",//防止中文输出乱码
"-fdiagnostics-color=always",
"-g",
"${file}",//指定被编译的文件
"-o",
"${fileDirname}\\${fileBasenameNoExtension}.exe"//指定生成可执行文件的路径
],
"options": {
"cwd": "C:/Program Files/mingw64/bin"
},
"problemMatcher": [
"$gcc"
],
"group": "build",
"detail": "编译器: \"C:/Program Files/mingw64/bin/gcc.exe\""
}
]
}
编译和执行程序
- 在完成上述步骤之后,就可以编译并生成可执行程序了。
- 结果如下
目录出现main.exe说明编译成功,接下来可以执行
- 新建终端
.\main.exe
执行代码
------------------------------
再写一份代码,如何配置
如果在已经配置好tasks.json的同工程目录下,不用改配置,直接运行生成任务
如果是新的工程目录,可以把.vscode文件夹直接复制过去,然后再运行生成任务
------------------------------------
编译执行多个源文件
一般的项目工程开发都会涉及到多个头文件以及多个源文件,所以编译执行多个源文件是很有必要的。
想要配置多源文件编译,我们可以把之前的单文件项目的.vscode文件夹复制过来。
c_cpp_properties.json就不用改了,因为他是编译路径配置
需要改的是task.json,需要更改编译的文件和生成的可执行文件
- 更改完之后如下图
{
"version": "2.0.0",
"tasks": [
{
"type": "cppbuild",
"label": "C/C++: gcc.exe 生成活动文件",
"command": "C:/Program Files/mingw64/bin/gcc.exe",
"args": [
"-fexec-charset=GBK",
"-fdiagnostics-color=always",
"-g",
"${workspaceFolder}\\*.c ",//"${workspaceFolder}\\*.c ",
"-o",
"${workspaceFolder}\\${workspaceRootFolderName}.exe"//"${workspaceFolder}\\${workspaceRootFolerName}.exe"
],
"options": {
"cwd": "C:/Program Files/mingw64/bin"
},
"problemMatcher": [
"$gcc"
],
"group": "build",
"detail": "编译器: \"C:/Program Files/mingw64/bin/gcc.exe\""
}
]
}
-------------------------------------
配置C++代码
首先我们建立工程,写一个cpp文件。
然后需要配置编译器选项
配置编译器路径
修改完之后,c_cpp_properties.json如下
{
"configurations": [
{
"name": "Win32",
"includePath": [
"${workspaceFolder}/**"
],
"defines": [
"_DEBUG",
"UNICODE",
"_UNICODE"
],
"windowsSdkVersion": "10.0.19041.0",
"cStandard": "c17",
"cppStandard": "c++17",
"intelliSenseMode": "windows-msvc-x64"
},
{
"name": "C++",
"includePath": [
"${workspaceFolder}/**"
],
"defines": [
"_DEBUG",
"UNICODE",
"_UNICODE"
],
"windowsSdkVersion": "10.0.19041.0",
"cStandard": "c17",
"cppStandard": "c++17",
"intelliSenseMode": "gcc-x64",
"compilerPath": "C:/Program Files/mingw64/bin/g++.exe"
}
],
"version": 4
}
这个时候就要配置基于cpp的task.json了
配置tasks.json
- 还是终端-配置任务
- 修改tasks.json
- 仍然是修改编译和生成两项使得可以多文件编译
{
"version": "2.0.0",
"tasks": [
{
"type": "cppbuild",
"label": "C/C++: g++.exe 生成活动文件",
"command": "C:\\Program Files\\mingw64\\bin\\g++.exe",
"args": [
"-fexec-charset=GBK",
"-fdiagnostics-color=always",
"-g",
"${workspaceFolder}\\*.cpp",
"-o",
"${workspaceFolder}\\${workspaceRootFolderName}.exe",
],
"options": {
"cwd": "${fileDirname}"
},
"problemMatcher": [
"$gcc"
],
"group": "build",
"detail": "编译器: \"C:\\Program Files\\mingw64\\bin\\g++.exe\""
}
]
}
- 然后再运行生成任务
执行完就可以编译和生成可执行文件了
-------------------------------------
调试
如果是在C工作区
打开运行-添加配置
或者是打开小甲壳虫创建launch.json
- 选择调试器
- 然后添加配置
- 修改以下内容
- 改成如下就可以了
{
// 使用 IntelliSense 了解相关属性。
// 悬停以查看现有属性的描述。
// 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "(gdb) 启动",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}\\${workspaceRootFolderName}.exe",
"args": [],
"stopAtEntry": false,
"cwd": "${fileDirname}",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"miDebuggerPath": "C:\\Program Files\\mingw64\\bin\\gdb.exe",
"setupCommands": [
{
"description": "为 gdb 启用整齐打印",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
]
}
]
}
如果是在Cpp工作区
第三步选择g++就好了
launch.json改成下面这样
{
// 使用 IntelliSense 了解相关属性。
// 悬停以查看现有属性的描述。
// 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "g++.exe - 生成和调试活动文件",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}\\${workspaceRootFolderName}.exe",//
"args": [],
"stopAtEntry": false,
"cwd": "${workspaceFolder}",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"miDebuggerPath": "C:\\Program Files\\mingw64\\bin\\gdb.exe",//
"setupCommands": [
{
"description": "为 gdb 启用整齐打印",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
],
"preLaunchTask": "C/C++: g++.exe 生成活动文件"
}
]
}
默认情况下,C ++扩展不会在源代码中添加任何断点,
将"stopAtEntry"的值改为true,在启动调试时使调试器在main方法上停止
"cwd": "${workspaceFolder}",调试程序时的工作目录为工作区文件夹;值改成${fileDirname}可变为文件所在目录
总结全流程及问题
- 图形化界面操作本质上还是调用命令行工具,所以后续还是要逐渐转向使用命令行
- CMake是必要的,后续再讲