C++ 前置知识手记

2,125 阅读4分钟

1. MSVCRT 和 UCRT 和 LIBC

MSVCRT 全称 Microsoft Visual C++ Runtime

MSVCRT 在所有 Microsoft Windows 版本上默认可用,但由于向后兼容性问题,发展不前。不兼容 C99 并且缺少一些功能。

  • 它不兼容 C99,例如 printf() 函数系列

  • mingw-64 提供替换功能,使 C99 在许多情况下兼容

  • 它不支持 UTF-8 语言环境

  • 与 MSVCRT 链接的二进制文件不应与 UCRT 链接的二进制文件混合,因为内部结构和数据类型不同。相同的规则试用于 MSVC 编译的二进制文件,因为 MSVC 默认试用 UCRT(如果未更改)

  • 在每个 Microsoft Windows 版本上开箱即用

UCRT 全称 Universal C Runtime

UCRT 是 Microsoft Visual Studio 默认试用的较新版本。它应该像试用 MSVC 编译代码一样工作和运行。

  • 在构建时和运行时与 MSVC 的兼容性更好

  • 它默认在 Windows 10 上提供,对于旧版本,您必须自己提供或取决于安装它的用户

**LIBC(GLIBC) 全程 Library C
**

libc 实现了标准 C 函数,如 strcpy() 和 POSIX 函数 (可能是系统调用),如 getpid()。请注意,并非所有标准 C 函数都在 libc 中,大多数都在 libm 中。

libc 是一个单一的库文件(.so 和 .a 版本都可用)并且在大多数情况下驻留在 /usr/lib 中。然而,glibc (GNU libc) 项目提供的不仅仅是 libc——它还提供了前面提到的 libm,以及其他像 libpthread 这样的核心库。所以 libc 只是 glibc 提供的库之一——除了 glibc,还有其他 libc 的替代实现。

C++ 的标准库名称是 libstdc++

2. MinGW 和 Cygwin 和 GCC 和 MSVC

MinGW 全称 Minimalist GNU for Windows

MinGW 是用于本机 Windows 的 GNU 编译器工具的发行版,包括 GNU Compiler Collection、GNU Binutils 和 GNU Debugger。还包括允许开发本机 Windows 应用程序的头文件和库。因此,这将作为 Microsoft Visual C++ 套件的开源替代品。

有可能使用 MinGW 编译一些最初打算用 Microsoft Visual C++ 进行编译的东西,并进行相对较小的修改。

默认情况下,在 MinGW 的 GCC 中编译的代码将编译为本机 Windows 目标,包括 .exe 和 .dll 文件,但您也可以使用正确的设置进行交叉编译,因为您基本上使用的是 GNU 编译器工具套件。

尽管 MingW 包含一些头文件和接口代码,允许您的代码与 Windows API 交互,但与常规标准库一样,这不会对您创建的软件施加许可限制。

MinGW 的缺点

使用 MinGW 为 Windows 编译的软件必须使用 Windows 自己的 API 进行文件和 IO 访问。如果您要将 Unix/Linux 应用程序移植到 Windows,这可能意味着对代码进行重大更改,因为不能再使用 POSIX 类型的 API。

CygWin 全称

Cygwin 是一个兼容层,通过模拟基于 Unix 的操作系统提供的许多基本接口,例如管道、Unix 风格的文件和目录访问等,可以很容易地将简单的基于 Unix 的应用程序移植到 Windows由 POSIX 标准记录。 Cygwin 还捆绑了 GNU Compiler Collection 的一个端口和 Cygwin 环境的一些其他工具。

如果您有使用 POSIX 接口的现有源代码,您可以在进行很少甚至没有更改后将其编译为与 Cygwin 一起使用,从而大大简化移植基于简单 IO 的 Unix 代码以在 Windows 上使用的过程。

Cygwin 的缺点

使用 Cygwin 进行编译涉及将您的程序与 Cygwin 运行时环境链接,该环境通常作为动态链接库 cygwin1.dll 与您的程序一起分发。这个库是开源的,需要使用它的软件共享一个兼容的开源许可证,即使你单独分发 dll,因为头文件和接口都包含在内。因此,这对您如何许可您的代码施加了一些限制

GCC 全称 GNU Compiler Collection

GNU 编译器集合包含C、C++、Object-C、Fortran、Ada、Go 和 D 的前端,以及这些语言的库(libstdc++,...)。GCC 最初是作为 GNU 操作系统的编译器编写的。GNU 系统被开发为 100% 自由软件,自由是因为它尊重用户的自由。

因 GNU/Linux 系统的广泛使用,GCC 一般被理解为 GNU/Linux 系统的编译器套件。

我们可以调用 /bin/gcc 工具来使用 GCC

MSVC 全称 Microsoft Visual C++

MSVC 是 Microsoft 的 C、C++和C++/CLI 集成开发环境,包括编译器、调试器。俗称 VC 或 VC++,MSVC 等。它的前身包括 Microsoft C/C++

我们可以调用 cl.exe 工具来使用 MSVC

参考

www.msys2.org/docs/enviro…

learn.microsoft.com/zh-cn/cpp/p…