【问题标题】:Are Libraries included at preprocessor or linking预处理器或链接中是否包含库
【发布时间】:2020-04-03 02:00:52
【问题描述】:

在 C++ 中构建可执行文件时,包含头文件时

例如, #include <iostream>

预处理器是否找到库 iostream 库和使用的函数,或者是链接时注入的库函数的目标代码?

【问题讨论】:

  • #include 基本上在预处理期间将标头的内容粘贴到您的源中。库和目标文件由链接器处理。
  • 标题基本上告诉编译器“这里有一些声明。我保证这些东西实际上是在另一个对象模块中定义的。”然后,链接器在将 obj 和静态库链接在一起时尝试修复这些引用。如果找不到,则会生成“未解决的外部”错误。
  • 这是一个非常好的问题。我唯一的问题是,如果以前没有被问过,我会感到非常惊讶。
  • Gopt 非常感谢,总是听到老师说“包含粘贴所需的内容代码”,然后当我遇到 Dynamica 和静态链接时,我认为这可能是定义,感谢您的澄清跨度>
  • 这能回答你的问题吗? How does #include work in C++?

标签: c++


【解决方案1】:

#include 所做的只是加载到库函数的定义中,与库本身的二进制实例没有任何关系。

将头文件视为库工作方式的蓝图,但不提供程序所需的实际组件。这只是为了让编译器能够理解库的工作原理。

为了让它发挥作用,您必须还链接到相关的库文件中。这是在链接阶段使用不同的参数完成的。

【讨论】:

  • 对不起,你的意思是加载和加载到内存中一样吗?或者加载含义只是将定义粘贴到 Cpp 翻译单元中?你的意思是头文件被认为是库函数、类的高级表示,但没有提供它们的定义?
  • 编译器需要它正在使用的函数的蓝图:它们采用什么参数?它们产生什么返回值?什么条件适用于使用?不一定提供实际的实现,它可能位于二进制库中。它加载这些定义,并使用它们来验证函数是否正确使用,以及根据编译代码中的内容为任务选择正确的函数。稍后链接器将实现库添加到您编译的目标中。
  • 头文件通常只是一种高级表示,但在某些情况下,与模板函数或内联函数一样,它们也是整个实现。这取决于您正在谈论的功能类型。
  • @StreamlineAstra 或者加载含义只是将定义粘贴到 Cpp 翻译单元中? 差不多。预处理器完成后,您会得到一个大文件,即源文件、所有#includeed 文件、执行的所有宏替换,以及任何实现定义的附加内容,例如在预处理期间解决的#pragma。文件实际上是写在任何地方还是仅仅存在于内存中取决于所使用的实现和编译器选项。
猜你喜欢
  • 2010-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-16
  • 1970-01-01
  • 1970-01-01
  • 2019-06-22
相关资源
最近更新 更多