c++库是如何工作的
How C++ libraries work?
据我所知,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
目录
- QSqlquery prepare()和bindvalue()不工作
- 导入库可以跨dll版本工作吗
- 以螺旋方式打印矩阵的程序.(工作不好)
- 对象指针在c++中是如何工作的
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- VSOMEIP-2个设备之间的通信(TCP/UDP)不工作
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- C++为线程工作动态地分割例程
- 为什么我的 std::ref 无法按预期工作?
- 布尔比较运算符是如何在C++中工作的
- SampleConsensusPrerejective(ext.RANSAC)是如何真正工作的
- 不确定要在我的main中放入什么才能使我的代码正常工作
- 为什么std::condition_variable notify_all的工作速度比notify_one快(对于随机请
- <<操作员在下面的行中工作
- 有人能解释一下为什么下界是这样工作的吗C++的
- ExtractIconEx:可以工作,但偶尔会崩溃
- C++中的memset函数工作不正常
- 当我在第一个循环中使用"auto"时,它工作正常,但是使用"int"它会给出错误,为什么?
- 当 int 方法工作正常时,void 方法有何不同,或者为什么我不能调用 void 方法?
- sdl软件渲染器不工作,工作在硬件加速的一个