【发布时间】:2021-12-18 11:07:57
【问题描述】:
我知道存在许多解决同一问题的问题,但我一直无法找到一个可以回答我的问题的问题。我理解编译和链接之间的大区别,前者将每个源文件以目标文件的形式翻译成机器代码,而后者将这些目标文件“链接”在一起形成一个可执行文件。
但是,一旦我们将预处理投入到这种混合中,我就会感到困惑。我的理解是,如果我们导入另一个库,那么这个库的 all 本质上就是复制并粘贴到我们的代码中。因此,即使我们正在处理多个文件并在另一个文件中调用,内容是否仍被转储到另一个文件中?如果是这种情况(我确信这是不正确的,并且我在某处有误解)为什么链接甚至是必要的?我们不是已经在处理一个巨大的聚合源文件了吗?
【问题讨论】:
-
链接将所有引用替换为正确的地址并生成输出(它将公开导出的函数,例如在动态库中)。它还将检查您的外部依赖项。而且它不是一个巨大的单个文件,需要链接多个转换单元
-
It is my understanding that if we import another library then all of this library is essentially copy and pasted into our code- 这是错误的。而且C中没有import这样的东西 -
@AnisBelaid 所以链接器只从导入的库中提取必要的函数并检查所有文件,因此声明中没有错误/冲突?
-
@APM500 是的,这是链接器所做的事情之一。
-
编译是将一种语言(c、swift、...)翻译成另一种语言(通常是处理器代码)。而已。链接正在构建一个可执行文件,其中包含所需的所有不同的(处理器)代码块:链接器在给定的目标文件或库列表中查找需要哪些块。这也意味着您可以更改库或对象以使用不同的版本而无需编译。
标签: c++ c compilation linker