据我所知,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开关),我就不多说了在这里。