加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

linux – 为什么我要为库更新重新编译整个程序?

发布时间:2020-12-13 18:49:13 所属栏目:Linux 来源:网络整理
导读:关于以下链接: http://www.archlinux.org/news/libpnglibtiff-rebuilds-move-from-testing/ 有人可以向我解释为什么在更新其中一个库之后应该重建一个程序吗? 这有什么意义,因为“主”文件根本没有改变? 解决方法 如果涉及的函数的签名没有改变,那么“重
关于以下链接:
http://www.archlinux.org/news/libpnglibtiff-rebuilds-move-from-testing/

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

这有什么意义,因为“主”文件根本没有改变?

解决方法

如果涉及的函数的签名没有改变,那么“重建”程序意味着必须再次链接目标文件.您不应该再次编译它们.

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

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读