每次程序调用时都会编译库吗?

时间:2014-01-17 02:17:08

标签: c compilation

根据我的理解,库就像是其他程序使用的API。由于库不是程序,除非你退出它,它是永久编译和运行的,每次程序调用它时都会编译库吗?例如,如果我想在库代码中调用get函数,每次调用函数时是否会再次编译所需的文件?

2 个答案:

答案 0 :(得分:2)

用于编译语言的库至少被编译为对象模块,有时甚至是动态库。

编译程序的典型步骤是:

  • 对于每个源模块,编译源以生成对象模块。
  • 链接一个或多个对象模块以生成可执行文件。
  • 将可执行文件加载到内存中并执行。

您可能无法在单独的命令中看到所有这些步骤,因为您使用的命令可能能够执行多个步骤。

对象模块可能存在于单个文件中,也可能被收集到包含任意数量对象模块的库或存档文件中。

如果库由链接到可执行文件的对象模块组成,则称为静态库。这种库中的对象模块基本上就像从程序的常规源构建的对象模块。要创建此类库,请执行以下步骤:

  • 将库的源模块编译为目标模块。
  • 运行ar等程序,将目标模块合并到一个档案中。
  • 发布存档,以便其他人可以使用它。
  • 记录库接口。 (这个步骤经常被忽略。)

在某些操作系统中,对象模块可能链接到动态库而不是可执行文件。实际上,可执行文件,动态库和对象模块在几个方面类似:它们包含带有计算机指令的段,带有数据的段,以及有关如何将段加载到内存中以及可执行文件定义或需要哪些符号的各种指令,库或模块。它们之间的差异之一是这些符号定义和需求得到解决的程度。

在程序执行时,可以将动态库链接到程序中。使用动态库的程序没有完全解析所有引用,即使它被加载并开始执行:它引用了动态库中的东西。当程序想要使用动态库中的东西时,它会执行代码,找到包含动态库的文件(完全编译并部分链接),然后将该库加载到内存中并解析对库的引用。

答案 1 :(得分:-2)

无 .........................................

每次调用时都不会重新编译库