【问题标题】:Core header files in c++c++中的核心头文件
【发布时间】:2014-04-19 18:58:06
【问题描述】:

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

#include <stdio.h> //Here is only declaration of functions, not implementation.

int main(){
    printf("Hello world");
}

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

【问题讨论】:

标签: c++ standard-library


【解决方案1】:

编译后的代码位于库中。这些库的确切位置和名称取决于平台和编译器。例如,在各种 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)组成它们的@987654323 @。动态库不作为 Windows 的一部分安装(尽管它们被许多应用程序使用,但它们存在于许多机器上)并且需要与您的应用程序一起使用 packaged and distributed

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

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

【讨论】:

  • 那么从什么链接器确实知道必须添加这个库?
  • 我想了解此链接的后续内容。让我们在自己的代码中包含 stdlib.h 并使用 double atof(const char *) 函数。为什么不能只在我们自己的代码中 decalre 这个函数并且不包含 stdlib.h?
  • @Dmitrii:是什么让你认为你做不到?你试过了吗?为防止这成为讨论(这不是 SO 的格式),我建议您通读我的答案中的链接,并搜索本网站和整个网络以获取有关预处理、编译和链接的更多信息过程,以避免不合格式的讨论和重复的问题。
猜你喜欢
  • 2017-06-13
  • 1970-01-01
  • 2012-01-24
  • 1970-01-01
  • 2011-07-04
  • 2014-04-06
  • 2012-04-12
  • 1970-01-01
  • 2011-09-14
相关资源
最近更新 更多