c++ - C++ 库如何工作?

标签 c++ compiler-construction header

<分区>

据我所知,Windows 操作系统使用汇编语言与硬件交互。 当他们这样做时,他们可以使用 c、c++ 或任何其他语言来完成其余的工作。

据我所知,C++ 头文件实际上调用了 windows api 来实现。

那么头文件位于哪里呢?它们是由编译器安装的吗?或者它们与操作系统一起提供?

头文件使用什么关键字或代码来与可用的 api 交互(例如 std::cout 在 windows 上,在 dll 文件中调用函数,在 linux 中调用另一个函数)?

例如 iostream.h 在 linux 和 windows 上有什么不同吗?

以及他们如何找到合适的库?

我的最后一个问题是,库如何与汇编代码交互?(所以汇编代码与硬件交互)

TIA。

最佳答案

以下段落并不是对库、编译过程或系统调用调用如何工作的任何形式的完整描述,而是对 OP 所问内容的鸟瞰图,因此缺少一些细节和重要段落这必须由 OP 自己深入研究

对于“C++ 库”,我假设您指的是 C++ standard library (尽管此处的注意事项也适用于任何其他库)。

默认情况下,C++ 标准库并非强制存在于任何操作系统上,它通常随编译器安装或辅助包一起提供。这并不意味着您不能执行 C++ 编译例程,您只需要头文件和库来编译您的程序以及支持它的编译器。

C++ 标准库通常是针对特定平台编译的,您不能只是将头文件和 lib 文件从一个操作系统复制到另一个操作系统(您最终会落泪)。

每次你从头文件中导入声明时,用类似的东西

#include <iostream>

您正在让您的程序了解标准库提供的数据结构、函数和类的多样性。您可以根据需要使用它们,只要您提供 .lib 文件(在 Windows 环境中),其中通常定义了例程的代码(在 Visual Studio 中,这通常称为带有 /MT/的运行时库linking 的 MD 选项) .

将可执行文件链接到那些 .lib 文件后,您就有了一个已编译的可执行文件,在反汇编程序中打开它可能有类似的东西(对于简单的 hello world,片段 from here - 不是 Windows 环境)

mov     edx,len                             ;message length
mov     ecx,msg                             ;message to write
mov     ebx,1                               ;file descriptor (stdout)
mov     eax,4                               ;system call number (sys_write)
int     0x80                                ;call kernel

因此,最终标准库提供的每个 C++ 函数或例程要么实现算法,要么最终通过 System Calls 调用某些操作系统特定例程。 .各种操作系统之间(甚至是系统调用点的边界)在设计和实现上还有几处差异,此外还有上千层安全检查(更不用说ring3/ring0开关),我就不多说了在这里。

关于c++ - C++ 库如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25470727/

相关文章:

header - 为什么 UDP 的头部有一个长度字段而 TCP 没有?

c++ - Qt : Background thread refreshing UI thread

c++ - 为什么枚举类的默认类型与枚举的基础类型不同?

c++ - xcode c代码编译错误

compiler-construction - ANTLR if-else 歧义错误

php - 在每个文件中包含 php 头文件

qt - 当 QTableWidget 中有一项时,如何防止标题被选中?

c++ - 如何返回静态数组指针

parsing - 从源码到 AST 再到 CodeDom

java - 用java编写的C编译器