我为什么要重新编译整个程序只是一个库更新?(Why should I recompile an en

2019-06-23 20:38发布

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

可能有人向我解释为什么它的图书馆之一已被更新后的程序应该重建?

如何使任何意义,因为“主”文件没有改变呢?

Answer 1:

如果所涉及的函数的签名没有改变,那么“重建”的计划意味着该目标文件必须重新连接 。 你不应该需要重新编译它们。

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

但在库 ,将内容 (即,实施方式)的功能可以改变。 当发生这种情况时,码的长度可以改变,所以的函数的地址可能会改变。 这是链接,了解每个函数的入口点所在,并填补这些地址到对象代码创建可执行的工作。

在另一方面,如果在库中的数据结构发生了变化,该库需要调用方来管理内存(一种不好的做法,但不幸的是常见的),那么你需要重新编译代码,以便它可以解释的变化。 例如,如果你的代码使用malloc(sizeof(dataStructure))针对该公司在规模扩大了一倍库中的数据结构分配内存,你需要重新编译代码,因为sizeof(dataStructure)将有一个较大的值。



Answer 2:

有两种类型的兼容性:API和ABI。

API兼容性是关于哪些其他程序可以依赖于函数和数据结构。 例如,如果libfoo的0.1版本定义了一个名为“程序hello_world()”的API函数,和0.2版本中移除,依赖于任何节目“程序hello_world()”需要更新与libfoo的新版本的工作。

ABI兼容性是关于如何功能的假设和,特别是,数据结构在二进制表示。 如果例如libfoo的0.1还定义了一个数据结构recipe的“成分”字段然后基于libfoo的方案0.1的配方必须重新编译,因为“指令”之前“指令”和“组分”和libfoo的0.2引入了“测量结果”:两个字段和“成分”领域将有可能在0.2版本的libfoo.so二进制的不同位置。



Answer 3:

什么是“图书馆”?

如果一个“文库”是唯一的二进制(例如动态链接库又名“.DLL”,“名为.dylib”或“所以‘;或又名’的.lib”或“.A”静态链接库),则有无需重新编译,重新链接应该足够(甚至可以在某些特殊情况下可避免)

在另一方面,库通常包括不仅仅是二进制对象更多 - 例如首标文件可能包括一些线(或宏)逻辑。 如果是的话,重新链接是不够的,你可能有,以充分利用的lib的最新版本重新编译。



文章来源: Why should I recompile an entire program just for a library update?