例如,我可以在头文件中添加新函数而无需使用该库重新编译所有程序吗?
答案 0 :(得分:1)
您可以将函数和对象添加到共享库,而不会破坏依赖该库的现有程序。在某些情况下,您可以增加库中对象(特别是数组)的大小。
如果函数签名没有改变,您也可以替换函数的实现。这不会导致动态链接出现任何问题,但如果新实现的行为不符合现有程序的预期,那么您将看到程序错误行为。
您可以删除没有程序链接的功能和对象。如果您只关注现有的程序,那么您可以对这些函数和对象进行编目,但是您只能对共享中的函数/对象的可见性进行评估。库 - 无法安全地删除外部可见的函数和对象。
可能还有其他特定于实现的共享库细节,可以在不破坏兼容性的情况下进行更改。
但请注意,这些都与头文件没有任何直接关系。共享库的兼容性主要是运行时考虑因素。头文件仅在编译时才相关。
答案 1 :(得分:0)
另一点是你必须非常小心任何共享结构。如果库中的函数接受或返回结构或指向结构的指针,并且如果对该结构进行任何更改(添加,删除或重新排列成员),则可能会引入不兼容性。
(严格来说,像这样的更改会被视为对其他人提及的功能签名的更改。)
如果你非常非常小心,你可以安排在结构的末尾添加新成员,但它通常需要调用者明确合作,使用预先定义的机制(即自版本以来遵守的机制) 0,通过所有调用代码,在进行任何更改之前)。