标准库-c++中的核心头文件

standard library - Core header files in c++

本文关键字:核心 文件 -c++ 标准      更新时间:2023-10-16

当我们想使用标准c++库中的函数时,我们会插入一个coressconding头文件。但头文件只是包含函数声明。这个功能是从什么实现中出现的?考虑以下简单程序:

#include <stdio.h> //Here is only declaration of functions, not implementation.
int main(){
    printf("Hello world");
}

这个功能在哪里实现?我没有指定要编译和链接其他.cpp文件。

编译后的代码驻留在库中。这些库的确切位置和名称取决于平台和编译器。例如,在各种Unixen GCC上,标准C++库有两个版本:"/usr/lib/libstdc++.so.{version}"answers"/usr/lib-libstdc++.a"。在旧版本的OS X上,您会发现"/usr/lib/libstdc++.{version}.dylib"answers"/usr/lib/libstdc++-static.a";较新版本使用libc++:"/usr/lib/libc++.{version}.dylib"。动态库不是作为Windows的一部分安装的(尽管它们被许多应用程序使用,但它们存在于许多计算机上),需要与应用程序一起打包和分发。

在编译代码(将C++代码转换为对象代码)之后,将出现链接,代码中的外部符号将解析为库中的符号。默认情况下,某些库(如libstdc++)通过链接器链接到您的目标代码。其他库可以添加到链接过程中。例如,如果您使用Boost.Thread,您会将Boost_Thread-mt、Boost_tthread-vc80-mt或任何本地名称添加到要链接的库列表中。

库的两个不同版本的原因是,一个提供静态链接,将库的目标代码复制到链接的代码中;另一个提供动态链接,将代码中的符号引用库文件,但不复制任何目标代码。后者的优点是文件大小较小(因为代码保存在一个库中,而不是在使用它的每个二进制文件中重复)。动态库的主要问题是依赖性地狱,两个不同的软件包需要不同的、不兼容的库版本。当陷入依赖地狱时,至少有一个库将是至少一个软件包的错误版本,因此无法工作。对库文件名进行版本控制有助于防止这种情况,因为多个库版本可以并行存在,并且软件二进制文件可以链接到适当的版本。