c++库是如何工作的

How C++ libraries work?

本文关键字:工作 何工作 c++      更新时间:2023-10-16

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

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

那么头文件位于哪里?它们是否由编译器安装?还是操作系统自带的?

头文件使用什么关键字或代码与合适的api进行交互(例如windows上的std::cout,调用dll文件中的函数,在linux中调用其他函数)?

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

他们是如何找到合适的库的?

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

TIA。

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

我假设你指的是c++标准库(尽管这里的考虑也适用于任何其他库)。

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

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

每当你从头文件中导入声明时,比如

#include <iostream>

让程序意识到标准库提供的数据结构、函数和类的变化。你可以随心所欲地使用它们,只要你提供。lib文件(在Windows环境中),其中通常定义了例程的代码(在Visual Studio中,这通常被称为带有/MT /MD选项的运行时库)用于链接。

一旦你把你的可执行文件链接到那些。lib文件,你就有了一个编译后的可执行文件,在反汇编器中打开,可能会有类似(对于一个简单的hello world,片段从这里-不是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++函数或例程要么实现一个算法,要么最终通过系统调用调用一些特定于操作系统的例程。在不同的操作系统(甚至是系统调用点的边界)之间存在一些设计和实现上的差异,此外还有上千层的安全检查(更不用说ring3/ring0开关了),所以我在这里就不多说了。

您可以尝试安装Windows SDK并检查%PROGRAMFILES%Microsoft SDKsWindows目录