windows上的C++编译环境

引子

昨天为了教大一的小朋友入门C++,又去折腾了下windows的环境。

windows上的开发环境,从老的到新的

  1. DevCpp (CCF出的一套针对初中生的编程入门书还在用这个,作为上手简化先把代码写起来的角度也能接受)
  2. VisualC++6.0 (学校教学居然还在用这个)
  3. VisualStudio 2019... (还是要体验过宇宙最强IDE)
  4. VSCode + CMake + MSYS2 (重点应该掌握这套)
  5. WSL环境(暂时不介绍,这就进入完整Linux环境了)

vscode+cmake+msys2 挺好用的。msys2现在很不错啊,内部有。mingw64, ucrt64, clang64 三个子环境可以选择。

  1. mingw64 = gcc + msvcrt + libstdc++ 安装后位于 c:\msys64\mingw64\ , 其实还有 mingw32 环境,忽略
  2. ucrt64 = gcc + ucrt + libstdc++ 安装后位于 c:\msys64\ucrt64\
  3. clang = clang + ucrt + libc++ 安装后位于 c:\msys64\clang64\

其中,msvcrt 和 ucrt 都是windows上的c运行时,最新的是ucrt,用msvcrt也没啥问题。

顺便简单梳理了下运行时:

  1. 操作系统有: windows, linux, mac
  2. 编译器有: msvc, gcc, clang
  3. c运行时库有: (msvcrt,ucrt), glibc, libsystem
  4. c++运行时有: msvcp..系列,libstdc++, libc++

实际上,运行时库有静态库和动态库,msvc相关的完整的应该参考:https://learn.microsoft.com/zh-cn/cpp/c-runtime-library/crt-library-features?view=msvc-170

这里面 CMake 作为第1入门掌握是最好的,因为从 CMake的配置文件 CMakeLists.txt 可以通过 CMake -G xxx 命令生成各种不同编译环境的项目文件(例如VisualStudio解决方案)或者构建配置文件(Makefile, Ninja)。 详细支持的Generator 参考: https://cmake.org/cmake/help/latest/manual/cmake-generators.7.html#manual:cmake-generators(7)

实际上这里还应该先大概知道这些环节,暂时先大致知道,后续再深入理解:

  1. 通过 cd build + cmake -G "MSYS Makefiles" .. 使用 CMakeLists.txt 生成了 build/Makefile
  2. 通过 cd build + cmake --build . 内部调用 make 从 Makefile 开始构建程序
  3. Makefile 内部实际上通过定义 tagert 和 target 的依赖,最终调用了 GCC 编译命令编译了源代码,生成了可执行文件
  4. 而 GCC 实际上内部调用的是 g++ 来编译 c++源代码

现代的C/C++入门应该从这些开始。

概述

Windows 上的C++编程环境比Linux上的繁杂很多,有许多工具已经很老了,但是很多教材也还在用,很多学校的教学也还在用。另一方面,有更现代的选择,但是需要一些必要的配置和对工具链组成的理解,本文将必要的环境都介绍一遍,让新手能有一个相对完整的理解,然后迅速抛弃老旧的工具链,使用更现代的工具链,同时如果学校的教学还是用老旧的工具链也能用,兼顾两者。

DevCpp

// todo

Visual C++ 6.0

// todo

Visual Studio (2019+)

// todo

Visual Studio Code + msys2

// todo

归纳1:C++工具链分层

上述几个C++的开发环境,基本的构成是下面三层

  • 编译工具链(IDE)
  • 编译器
  • C运行时库 + C++运行时库

归纳2: 构建系统分层

编译工具链这层,内部又根据不同的环境有内部的不同组织,本质上他们最终都调用编译器来执行命令。我们以CMake的角度来看这里面的分层,因为CMake的配置可以通过指定CMake的Generator来生成其他大部分构建系统的配置或者脚本,因此CMake也叫元构建系统。

  • 元构建系统:CMake
  • 构建系统:Make,Ninja,VisualStudio项目配置
  • 编译器:GCC,Clang

参考资料

[1] https://code.visualstudio.com/docs/cpp/config-mingw
[2] https://www.oschina.net/translate/c-c-standard-library?lang=chs&p=2
[3] https://learn.microsoft.com/zh-cn/cpp/c-runtime-library/crt-library-features?view=msvc-170

[1] glibc: https://www.gnu.org/software/libc/
[2] libstdc++: https://gcc.gnu.org/onlinedocs/libstdc++/
[3] libc++: https://libcxx.llvm.org/
[4] cmt+msvcrt, ucrt, vcruntime, cpmt+msvcprt: https://learn.microsoft.com/zh-cn/cpp/c-runtime-library/crt-library-features?view=msvc-170
[5] Mac下,libc是libsystem的一部分:https://www.oreilly.com/library/view/mac-os-x/0596003560/ch05s02.html
[6] https://blog.conan.io/2022/10/13/Different-flavors-Clang-compiler-Windows.html

posted @ 2023-10-05 12:12  ffl  阅读(237)  评论(0编辑  收藏  举报