当前位置: 首页 > 面试题库 >

为什么我应该只为更新库而重新编译整个程序?

史修谨
2023-03-14
问题内容

关于以下链接:http : //www.archlinux.org/news/libpnglibtiff-rebuilds-move-from-
testing/

有人可以向我解释为什么其中一个库已更新后应重新构建程序吗?

既然根本没有更改“主”文件,那有什么意义?


问题答案:

如果所涉及功能的签名没有更改,则“重建”程序意味着必须再次 链接 目标文件。您无需再次 编译 它们。

API是合约,描述了库中公共功能的接口。当编译器生成代码时,它需要知道什么类型的变量以及以什么顺序传递给每个函数。它还需要知道返回类型,因此它知道将从函数返回的数据的大小和格式。编译代码时,库函数的地址可能表示为“库的开头加上140字节”。编译器不知道绝对地址,因此仅指定距库开头的偏移量。

但是 库中,功能的 内容
(即实现)可能会更改。发生这种情况时,代码的长度可能会更改,因此函数的地址可能会更改。链接器的工作是了解每个函数的入口点所在的位置,并将这些地址填充到目标代码中以创建可执行文件。

另一方面,如果库中的 数据结构 发生了变化,并且库要求调用者管理内存(这是一种不好的做法,但不幸的是很常见),那么您
需要重新编译代码,以便它可以解决这些更改。例如,如果您的代码用于malloc(sizeof(dataStructure))为大小加倍的库数据结构分配内存,则您将需要重新编译代码,因为sizeof(dataStructure)它将具有更大的值。



 类似资料:
  • 我正在使用Bukkit API 1.8和Java7。 我有一个重复的任务,循环通过服务器上的所有玩家,并将他们的盔甲随机设置为皮革,链甲等... 当我使用、等方法时...我像往常一样更新他们的库存,但由于这个任务是每6滴答运行一次,它运行得很快。因此,当玩家试图发射弓时,每次此任务运行时弓都会重置其威力。 因为我知道更新库存有问题,所以我尝试删除方法。 我如何在保持任务运行的同时保持弓不重置? 我

  • 我知道我可以一个RDD来增加它的分区,并使用coalesce来减少它的分区。关于这一点,我有两个问题,在阅读了不同的资源后,我无法完全理解。 当生成RDD时,Spark将使用合理的默认值(每个块1个分区,最初的版本是64MB,现在是128MB)。但是我也读到建议使用2到3倍于运行作业的内核数量。所以问题来了: > 一个给定的文件应该使用多少个分区?例如,假设我有一个10GB。拼花文件,3个执行器,

  • 问题内容: 我有如下代码: 但是,不是在每次调用setText时在循环的每次迭代后更新文本区域,而是仅在完成所有任务运行后才更新文本。为什么会发生这种情况,我该如何解决? 问题答案: 您可能正在使用Swing线程,该线程正在等待代码执行才能更新UI。尝试为该循环使用单独的线程。

  • choice5是一个JComboBox 从choice5中选择项目时 被称为(编辑:对于我可以选择的每个项目,我可能有一个不同的jtable我想要显示) 编辑(SSCCE): MyTableModel

  • 下面是我请求的权限。 com.anddoes.launcher.permission.update_count,com.google.android.c2dm.permission.receive,com.google.android.finsky.permission.bind_get_install_referr_service,com.google.android.providers.gsf

  • 我担心我应该将、和设置为什么。 > 我首先担心的是,如果我将 设置为 23,这是现在最新的版本,旧设备是否能够运行它? 我如何确切地知道我的< code>minSdkVersion应该是什么,以确保运行较低api或版本的手机无法访问它(我不想将最低sdk设置得太高,因为这会阻止可能运行该应用程序的手机)? 我应该如何设置我的 ?