IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 开发工具 -> 【开发环境配置】VScode + gcc + cmake in Windows -> 正文阅读

[开发工具]【开发环境配置】VScode + gcc + cmake in Windows

主流C++编译器

参考文档
原视频

1. Gnu Complier Collection

一组编译器套件,并非单独的一个编译器。包含C/C++、Objective-C、Java、Go等语言的编译器,以及这些语言的库(e.g. libstdc++、libgcj)


gcc/g++:gcc 和 GCC 是两个不同的东西,gcc 是 GCC 中的 GNU C Complier(C编译器),而 g++ 是 GCC 中的 GNU C++ Complier(C++编译器)。

而究其本质,gcc/g++ 不是编译器,只是一种驱动器,根据参数中要编译的文件类型(.c .cpp)调用相应的GNU编译器。

  • gcc 将 .c 文件和 .cpp文件分别当做 c 和 c++ 文件编译,不自动连接 STL
  • g++ 将 .c 文件和 .cpp文件统一当做 c++ 文件编译,并且自动连接 STL

因此,使用 gcc 编译 c++ 文件,需要手动加参数 -lstdc++ 以使用 STL,但并非gcc -lstdc++g++等价。

2. Clang

基于LLVM


传统编译器架构:

  • Frontend 前端:语法分析,生成中间代码
  • Optimizer 优化器:优化中间代码
  • Backend 后端:生成机器码

LLVM:一种新式编译器架构,它的 前端后端模块化的,而所有的前端通过同一个LLVM优化器,再分别链接不同的后端。
比如,Clang 就是 LLVM 对于 C/C++ 的Frontend,对于其它语言来说,也都有各自对应的前端。而针对不同的体系结构如 x86、arm,也有相应的 LLVM for x86/arm Backend

  • 如果需要支持一种新的编程语言,只需要实现一个新的前端
  • 如果需要支持一中新的硬件设备,也只需要实现一个新的后端

对于传统编译器如 GCC 来说,每一种语言都需要一个前端、一个后端、一个优化器,前后端高耦合,扩展性显而易见地弱于 LLVM。

相较于 GCC,Clang还具有以下优点:

  • 编译速度快
  • 占用内存小
  • 中间代码可读性强,便于调试和诊断

3. Microsoft C++ Collection

Microsoft Visual C++,即 MSVC,是 Windows Visual Studio 的一部分,是其中C、C++ 和汇编语言的开发工具


可以同时安装 VS2015/17/19 三个版本,它们编译器大版本都是14

Visual Studio版本Visual C++ 版本C++编译器版本
VS2015msvc-140v140
VS2017msvc-150v141
VS2019msvc-160v142

Q:为什么不同的处理器需要不同的C++编译器?
A:不同的CPU体系结构(x86、x64、arm)具有不同汇编指令集,而编译器恰恰是把C++代码翻译成汇编代码的工具。

Q:为什么不同的操作系统厂商也在发展各自的编译器?
A:虽然C++标准库是一样的,但是在不同操作系统上的实现不同,因为需要适配不同操作系统的自有头文件动态库等。(e.g. windows sdk、win32 API、linux-xx-dev)

Q:What is GNU?
AGNU is Not Unix,是自由软件基金会发起的一项计划,这个计划中包含许许多多的软件,GCC 编译器是其中之一,而Linux系统本身也是一个GNU软件。GNU 规定了这些软件需要遵守的一些协议条款,满足这些协议的软件就被视为GNU软件,其中最著名的就是GPL协议。其实,70年代出现的UNIX 作为一种商业用操作系统不开源、不免费(e.g. solaris)。因此1985年,Richard Stallman创立自由软件基金会为GNU计划提供支持,GNU的最终目标就是开发一套开源免费的操作系统,并设计了开源免费的内核Hurd。当时的计算机并没有各种各样的io设备,所谓的操作系统基本等于内核。Linus Torvalds在1991年设计出了开源、免费的Unix-like的内核Linux,并且由于其Unix-like的特性,使其可以兼容许多Unix软件,相较于Hurd优势巨大。而Linux的开源协议,恰恰就是GPL。在开源过程中,GNU中的许多工具(GNU包含许多软件,且均开源,这些软件中有一些工具性质的软件,比如GCC)被集成到Linux平台。最后,GNU的计划也算成功实现了——虽然Hurd失败了,但Linux成功了。Linux的发行版,指的是使用Linux内核,并做了一些其它功能的操作系统软件。

step1 安装MinGW和cmake

MinGW
cmake

  1. 下载 MinGW 和 cmake
  2. 找到文件夹 …\MinGW\bin,复制该文件的路径
  3. 设置环境变量,在用户变量的 Path 中新建一个环境变量,将复制的路径粘贴进去,确定
  4. win + R呼出 cmd,输入g++ --version查看版本信息,显式 GCC 则说明配置成功
  5. 如此对 …\cmake-3.21.3-windows-x86_64\bin 添加环境变量,在 cmd 内输入cmake --version查看版本信息

Q:What is Cmake?
A:Cmake 是一款快捷生成 makefile 的工具,makefile 是编译大型软件前我们提前设置好的编译规则,然而 makefile 的编写并不容易,使用 Cmake 可以大大简化编写 makefile 的工作量

step2 配置VScode

  1. 安装 Code Runner 扩展
  2. 安装 C/C++ 扩展(注意安装在原生系统中还是 WSL 中)
  3. 在文件夹中打开 VScode,ctrl + alt + n运行代码,计划通
  4. 文件-首选项-设置,输入run in terminal,找到 Code Runner 对应的选项,打勾,这样在终端运行时就不再是只读权限,我们可以向程序输入内容了
  5. 继续安装 cmake 和 cmake tools 扩展

step3 使用g++编译.cpp文件

原视频

  1. 新建文件夹,在 VScode 内打开,并添加 main.cpp 文件,随便输入一段代码,以 swap 功能为例
  2. 在VScode的终端内输入g++ .\main.cpp编译 .cpp 文件,这里输入g++ main后直接按tab就可以自动补全
  3. 编译好后左侧会出现一个新的可执行文件 a.exe ,我们继续在终端内输入.\a.exe执行这个文件,同样也是输入a后直接按tab自动补全
  4. 此时我们向终端输入ls,查看当前新建文件夹内的文件,会发现除了显示 main.cpp 和 a.exe 以外,还会显示它们的文件大小,我们直接使用 g++ 命令编译得到的可执行文件内部不包含调试信息,无法进行调试
  5. 继续向终端输入g++ -g .\main.cpp -o test,其中-g代表包含调试信息,-o为自定义 exe 文件名称,那么,左侧就会生成一个新的可执行文件 test.exe,再次输入ls发现 test.exe 的大小更大一些

step4 使用VScode调试单个.cpp文件生成的.exe文件

  1. 在当前文件夹中,点击左侧运行和调试图标,点击create a launch.json file生成 launch.json 文件,依次选择 GDB/LLDB、g++.exe,launch.json 是 VScode 用于调试的配置文件,比如指定调试语言环境,指定调试类型等等
  2. 生成 json 文件后就可以在 main.cpp 内任意一行打断点,按F5对断点进行调试,在 json 文件生成后,当前文件夹内就会自动生成 main.exe 文件,我们打好断点就能进行调试,正是因为这个文件的存在
  3. launch.json 文件中,最为重要的两行分别是"program": "${fileDirname}\\${fileBasenameNoExtension}.exe","preLaunchTask": "C/C++: g++.exe 生成活动文件"
  • "program"就是我们需要调试的 .exe 文件,生成可执行文件前必需的编译链接,都由 VScode 自动完成
  • "preLaunchTask"则代表着调试前 VScode 需要做的工作,这些信息被包含在 task.json 中,也是VScode 自动生成的
  • 正因为 launch.json 包含了这些信息,因此我们只需要生成一个 launch.json 文件就可以对单个可执行文件进行调试

step5 使用VScode调试多个.cpp文件生成的.exe文件

  1. 删掉当前文件夹中的可执行文件和 json 文件,只保留一个 main.cpp,并新建一个新的 swap.cpp 文件和 swap.h 文件
  2. 把 main.cpp 中的 swap()放到 swap.cpp 中,在 swap.h 中添加 swap() 的函数声明void swap( int& a, int& b );(注意函数声明后面的分号),在 swap.cpp 和 main.cpp 中包含我们自定义的这个头文件#include "swap.h"(包含自定义头文件用双引号)
  3. 在终端输入 g++ -g .\main.cpp .\swap.cpp -o test,将多个 .cpp 文件编译成一个可执行文件 test.exe
  4. 在调试窗口再次生成 launch.json,会报错(原视频 VScode 的版本是进入了调试页面,但是调试时报错),出错的地方都是"preLaunchTask": "C/C++: g++.exe 生成活动文件",并且并未像单文件调试一样,生成一个默认的 a.exe
  5. 原因是默认生成的 task.json 只能编译单个文件,无法识别多个文件,如果想要编译多个文件,需要我们自己配置 launch.json 和 task.json
  1. 打开 launch.json ,找到"cwd",代表当前文件夹的绝对路径,将它的值${fileDirname}拷贝到"program"中,并添加上面编译完成的 .exe 文件名,修改后即"program": "${fileDirname}/test.exe",,这行代码将 launch.json 与我们手动编译的 test.exe 绑定,表示我们接下来要调试的文件是 test.exe
  2. ctrl + /注释掉"preLaunchTask"ctrl + s保存,再回到 main.cpp 中,断点调试,成功

step6 编写简单的CMakeLists.txt文件

  1. 在当前文件夹中新建文件 CMakeLists.txt(文件名一个字母不要错)
  2. 在 CMakeList.txt 中输入project(swapfunc),括号里为项目的名称
  3. 继续输入add_executable(swap_cmake main.cpp swap.cpp),swap_cmake 是可执行文件的名称,后面是我们需要编译的两个 .cpp 文件,最简单的 cmakelist 就这样写完了
  4. 按下ctrl + shift + P,输入 cmake,点击 Cmake: Configure,选择我们需要的编译器 GCC,此时在最下方的状态栏会显示当前编译器版本为 GCC,与此同时,当前文件夹下自动生成 build 文件夹,用于 cmake 进行外部构建
  5. 在终端内输入cd .\build\,再输入cmake ..(有个空格),显示 -- Configuring done -- Generating done,说明一切正常
  6. 在 bulid 文件夹下输入min,按下tab补全为mingw32-make.exe (这是windows中make的名字,Linux中不是这个名字),然后执行,在 build 文件夹中顺利生成可执行文件 swap_cmake.exe
  • make执行后,生成的第一行和第二行代码是将两个 .cpp 文件编译成二进制文件
    [33%] Building CXX object CMakeFiles/swaptest.dir/main.cpp.obj
    [66%] Building CXX object CMakeFiles/swaptest.dir/swap.cpp.obj
  • 第三行代码完成链接
    [100%]Linking CXX executable swap_cmake.exe

step7 调试Cmake生成的可执行文件

  1. 进入 launch.json 文件,更改"program"选项为 swap_cmake.exe 所在的路径 ,得到"program": "${workspaceFolder}/build/swaptest.exe",注释掉 "preLaunchTask" ,回到 main.cpp,断点调试成功
  2. 如果是 cmake 编译后重新生成的 launch.json,自动就没有"preLaunchTask" ,并且需要修改"miDebuggerPath"的值为"C:\\MinGW\\bin\\gdb.exe",这个路径找到了 MinGW 文件夹内的 gdb.exe,注意这里描述路径用的是" \\",而非 windows 惯常使用的" /"(我又将"name"的值改为g++.exe,不清楚不改是否有影响),改好后断点调试成功
  3. 在 CMakeList.txt 中输入project(swapfunc),括号里为项目的名称
  4. 继续输入add_executable(swap_cmake main.cpp swap.cpp),swap_cmake 是可执行文件的名称,后面是我们需要编译的两个 .cpp 文件,最简单的 cmakelist 就这样写完了
  开发工具 最新文章
Postman接口测试之Mock快速入门
ASCII码空格替换查表_最全ASCII码对照表0-2
如何使用 ssh 建立 socks 代理
Typora配合PicGo阿里云图床配置
SoapUI、Jmeter、Postman三种接口测试工具的
github用相对路径显示图片_GitHub 中 readm
Windows编译g2o及其g2o viewer
解决jupyter notebook无法连接/ jupyter连接
Git恢复到之前版本
VScode常用快捷键
上一篇文章      下一篇文章      查看所有文章
加:2021-10-02 15:04:03  更:2021-10-02 15:04:21 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/16 1:50:20-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码