C++编译原理简介
一个完整的C++程序开发大致经历以下几个步骤:
- coding: 使用编辑器编写程序,这个文件就是程序源代码。
- compile: 编译源代码,这意味着将程序源代码翻译成机器语言,得到目标代码(object code,以o或obj作为文件后缀),如果有语法错误,则会编译失败。
- link: 将目标代码、库代码和启动代码统一在一起。
-
build:compile+link+生成exe可执行程序几个步骤合在一起,就成为构建(build)。
已有环境:
- Windows 10系统
- Visual Studio Code
Step1:安装编译器
大多数Linux发行版与MacOS系统都自带C++编译器,而Windows则通常没有。在命令行输入命令检查是否有gcc编译器:
g++ --version
检查是否有clang编译器:
clang --version
命令行显示:
则说明编译器不存在。
首先我们在windows安装MYSYS2:
- MSYS2是一组工具和库,为用户提供易于使用的环境,用于构建、安装和运行本机 Windows 软件。此工具包含mintty命令行终端,以及bash,以及git和subversion等版本控制工具,以及tar和awk等工具。MSYS2 为 GCC、mingw-w64、CPython、CMake、Meson、OpenSSL、FFmpeg、Rust、Ruby 等提供最新的原生构建。它提供了一个名为Pacman的软件包管理系统。
安装完成后,需要勾选Run MSYS 64bit now:
然后在命令行输入pacman -Syu以更新软件包:
$ pacman -Syu
:: Synchronizing package databases...
mingw32 805.0 KiB
mingw32.sig 438.0 B
mingw64 807.9 KiB
mingw64.sig 438.0 B
msys 289.3 KiB
msys.sig 438.0 B
:: Starting core system upgrade...
warning: terminate other MSYS2 programs before proceeding
resolving dependencies...
looking for conflicting packages...
Packages (6) bash-5.1.004-1 filesystem-2021.01-1
mintty-1~3.4.4-1 msys2-runtime-3.1.7-4
pacman-5.2.2-9 pacman-mirrors-20201208-1
Total Download Size: 11.05 MiB
Total Installed Size: 53.92 MiB
Net Upgrade Size: -1.24 MiB
:: Proceed with installation? [Y/n]
:: Retrieving packages...
bash-5.1.004-1-x86_64 2.3 MiB
filesystem-2021.01-1-any 33.2 KiB
mintty-1~3.4.4-1-x86_64 767.2 KiB
msys2-runtime-3.1.7-4-x86_64 2.6 MiB
pacman-mirrors-20201208-1-any 3.8 KiB
pacman-5.2.2-9-x86_64 5.4 MiB
(6/6) checking keys in keyring 100%
(6/6) checking package integrity 100%
(6/6) loading package files 100%
(6/6) checking for file conflicts 100%
(6/6) checking available disk space 100%
:: Processing package changes...
(1/6) upgrading bash 100%
(2/6) upgrading filesystem 100%
(3/6) upgrading mintty 100%
(4/6) upgrading msys2-runtime 100%
(5/6) upgrading pacman-mirrors 100%
(6/6) upgrading pacman 100%
:: To complete this update all MSYS2 processes including this terminal will be closed. Confirm to proceed [Y/n]
完成这个步骤后会关闭命令行窗口。我们需要再次在开始菜单搜索MSYS2启动命令行,输入pacman -Su更新剩下的包(这些步骤是官方教程给的,我也想不懂为啥是这样的):
$ pacman -Su
:: Starting core system upgrade...
there is nothing to do
:: Starting full system upgrade...
resolving dependencies...
looking for conflicting packages...
Packages (20) base-2020.12-1 bsdtar-3.5.0-1
[... more packages listed ...]
Total Download Size: 12.82 MiB
Total Installed Size: 44.25 MiB
Net Upgrade Size: 3.01 MiB
:: Proceed with installation? [Y/n]
[... downloading and installation continues ...]
接下来输入pacman -S --needed base-devel mingw-w64-x86_64-toolchain
来安装mingw-w64 gcc工具集。
Step2:GCC加入环境变量
如下图,在系统变量->Path中添加C:\msys64\mingw63\bin
:
启动或者重启Powershell,输入
gcc --version
,显示了gcc版本,则说明编译器安装成功。
Step3:vscode中构建C++程序
首先在vscode扩展商店里安装C/C++
以及C/C++ Extension Pack
,再安装一个code runner
:
然后在工程根目录下编写C++程序,以编写一个计算阶乘的程序为例:
#include<iostream>
#include <stdlib.h>
using namespace std;
long long fact(long long n) {
if (n < 0) return -1;
if (n == 0) return 1;
return n * fact(n - 1);
}
int main() {
long long n;
cout << "Please input number: ";
cin >> n;
long long res = fact(n);
cout << "Factorial of " << n << " is " << res << endl;
system("pause...");
return 0;
}
如何build写好的程序:点击终端/Terminal
->运行生成任务/Run build task
->选择C/C++: g++.exe生成活动文件
此时在左侧资源管理器显示了构建的exe文件:
快捷键
ctrl+~
在vscode调出powershell,输入./fact,就可以启动程序了:c_cpp_properties.json配置文件
VSCode C++配置文件主要包括./.vscode目录下的:
- c_cpp_properties.json:c/c++相关的基础配置
- tasks.json:构建任务的配置
- launch.json:debug配置
点击ctrl+shift+p调出命令面板,然后输入c/c++,选择edit configurations:
此时工程目录就会自动新建.vscode文件夹,编辑里面的c_cpp_properties.json:
{
"configurations": [
{
"name": "Win32",
"includePath": [
"${workspaceFolder}/include"
],
"defines": [
"_DEBUG",
"UNICODE",
"_UNICODE",
"MAX_NUM=100"
],
"windowsSdkVersion": "10.0.19041.0",
"compilerPath": "C:\\msys64\\mingw64\\bin\\g++.exe",
"cStandard": "c11",
"cppStandard": "c++17",
"intelliSenseMode": "gcc-x64"
}
],
"version": 4
}
configurations下面包含了多组配置对象,version官方建议不要修改此字段,它主要用于版本跟踪。configurations下面的配置有:
- includePath:引入头文件的路径。我通常会将需要引入的头文件复制到工程目录的include子路径下,includePath写
"${workspaceFolder}/include"
。 - compilerPath:编译器路径,填写刚才安装的编译器路径
C:\msys64\mingw64\bin\g++.exe
- intelliSenseMode:智能感知编译器版本,不同系统有不同的默认值(MSVC,gcc,clang)。我填写
gcc-x64
- defines:IntelliSense引擎在解析文件时使用的预处理器定义列表
tasks.json配置文件
tasks.json将会告诉vscode如何构建你的c++程序。点击终端
->配置默认生成任务
,此时.vscode目录会新建一个tasks.json配置文件:
{
"version": "2.0.0",
"tasks": [
{
"type": "cppbuild",
"label": "C/C++: g++.exe 生成活动文件",
"command": "C:\\msys64\\mingw64\\bin\\g++.exe",
"args": [
"-fdiagnostics-color=always",
"-g",
"${file}",
"-o",
"${fileDirname}\\${fileBasenameNoExtension}.exe"
],
"options": {
"cwd": "${fileDirname}"
},
"problemMatcher": [
"$gcc"
],
"group": {
"kind": "build",
"isDefault": true
},
"detail": "编译器: C:\\msys64\\mingw64\\bin\\g++.exe"
}
]
}
tasks内包含多组任务配置对象,每个对象的配置如下:
- label:任务名称
- command制定用什么编译器构建,可以写编译器的绝对路径;如果编译器添加到了系统变量,也可以直接写g++;
- args:命令行中给g++传入的参数
launch.json配置文件
此配置文件主要用于debugger的配置。点击运行
->添加配置
->C++ (GDB/LLDB)
,选择编译器,此时.vscode目录下会自动生成launch.json配置文件:
{
// 使用 IntelliSense 了解相关属性。
// 悬停以查看现有属性的描述。
// 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "g++ - 生成和调试活动文件",
"type": "cppdbg",
"request": "launch",
"program": "${fileDirname}\\${fileBasenameNoExtension}.exe",
"args": [],
"stopAtEntry": false,
"cwd": "${fileDirname}",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"miDebuggerPath": "gdb.exe",
"setupCommands": [
{
"description": "为 gdb 启用整齐打印",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
],
"preLaunchTask": "C/C++: g++.exe 生成活动文件"
}
]
}
在此我直接使用系统默认的配置,更详细的配置参考下方reference的debugging。然后给程序打好断点,点击左侧活动栏的运行和调试
,点击g++ 生成和调试活动文件
,就可以debug了:
Reference
C/C++ for Visual Studio Code
MSYS2 installation guide
c_cpp_properties.json reference
Debugging