【问题标题】:Is a library compiled every time a program invokes it? [closed]每次程序调用它时都会编译一个库吗? [关闭]
【发布时间】:2014-01-17 02:17:07
【问题描述】:

据我了解,库就像是供其他程序使用的 API。由于库不是程序,除非您退出它,否则它将永远编译并运行,那么每次程序调用它时都会编译该库吗?比如我想在库代码中调用一个get函数,每次调用该函数时,需要的文件会不会重新编译一次?

【问题讨论】:

  • 不,你链接的是库,这已经是库的源文件编译的输出了。
  • 这确实是一道基本的计算机科学问题。您可以在任何教科书和千兆字节的 Internet 页面中找到答案。
  • 我看不出以“不清楚你在问什么”而结束的投票是合理的。这个问题很清楚。
  • 有点同意@EricPostpischil - OP 可能不清楚编译和动态链接之间的区别 - 但问题本身很好。据推测,关于 SO 的每个问题都可以用足够多的“教科书”或“谷歌搜索”来回答……

标签: c compilation


【解决方案1】:

用于编译语言的库至少被编译为对象模块,有时还进一步编译为动态库。

编译程序的典型步骤是:

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

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

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

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

  • 将库的源模块编译成目标模块。
  • 运行诸如ar 之类的程序,将对象模块组合成一个存档。
  • 发布存档以便其他人使用。
  • 记录库接口。 (这一步经常被忽视。)

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

可以在程序执行时将动态库链接到您的程序中。使用动态库的程序并没有完全解析其所有引用,即使它已加载并开始执行:它具有对动态库中事物的引用。当程序想要使用动态库中的内容时,它会执行代码来查找包含动态库(已完全编译和部分链接)的文件,并将该库加载到内存中并解析对该库的引用。

【讨论】:

    【解决方案2】:

    没有 .........................................

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

    【讨论】:

    • 请多写一点...
    • 这并没有提供问题的答案。要批评或要求作者澄清,请在其帖子下方发表评论。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-20
    • 1970-01-01
    • 2013-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多