c++ - C++中的核心头文件

标签 c++ standard-library

当我们想要使用标准 C++ 库中的函数时,我们需要包含相应的头文件。但是头文件只包含函数声明。这个函数的实现是从什么地方出现的?考虑以下简单程序:

#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}”和“/usr/lib/libstdc++.a”。在旧版本的 OS X 上,您会找到“/usr/lib/libstdc++.{version}.dylib”和“/usr/lib/libstdc++-static.a”;较新的版本使用 libc++:“/usr/lib/libc++.{version}.dylib”。 (更多关于为什么在下面的单个系统上有两个版本。)Windows 上的 GCC 和 MingW 都有一个 libstdc++-{version}.dll,其中 Visual Studio 有许多库(例如 msvcp110.dll, msvcprt.lib )组成它们的 runtime library 。动态库不是作为 Windows 的一部分安装的(尽管它们被很多应用程序使用,它们存在于许多机器上)并且需要与您的应用程序一起使用 packaged and distributed

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

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

关于c++ - C++中的核心头文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23174161/

相关文章:

java - Java 是如何制作它的窗口的?

c++ - 如何赋予这个变量全局作用域

c++ - 为 SPOJ NAKANJ - Minimum Knight Moves 编写条件 block 的更简单方法

C++:方法重载的奇怪行为

c++ - Android NDK 链接器 (GStreamer) - 链接器名称无效 -fuse-ld=gold

java - Java 中 iterable<Integer> 的 Collections.max 函数

c++ - std::tuple_element 可以兼作通用模板参数检索器吗?

c++ - libjingle的XmppPump编译问题

计算C中的时间差

scala - Scala排序是否稳定?