2016-09-27 51 views
0

例如,我可以在頭文件中添加新功能,而無需重新編譯使用該庫的所有程序?可在.so庫中更改哪些內容而不破壞兼容性

+0

經驗法則:允許添加,但刪除不允許。 – Downvoter

+0

只有頭* * *? –

+1

@Downvoter是正確的,但我想補充一點,重要的問題是每個導出的符號都應該保持導出並指向完全相同的數據類型,即不要更改現有函數的簽名。 –

回答

1

您可以函數和對象添加到共享庫,而不會破壞依賴該庫的現有程序。在某些情況下,您可以增加庫中對象的大小(特別是數組)。

如果函數簽名沒有改變,您也可以替換函數的實現。這不會導致動態鏈接的任何問題,但是如果新實現的行爲不符合現有程序的期望,那麼您會看到程序不當行爲。

您可以刪除沒有程序鏈接到的函數和對象。如果您只關注現有的程序,那麼您可能能夠對這些功能和對象進行編目,但除此之外,您只能對共享庫中功能/對象的可見性進行評估 - 可見的功能和對象不能安全地被刪除。

可能還有其他實現特定的共享庫細節,可以在不中斷兼容性的情況下進行更改。

但是,請注意,沒有任何東西與頭文件直接有關。共享庫的兼容性主要是運行時間的考慮。頭文件僅在編譯時相關。

0

另一點是你必須非常小心任何共享結構。如果庫中的函數接受或返回結構或指向結構的指針,並且如果對該結構進行了任何更改(添加,刪除或重新排列成員),則可能會引入不兼容性。

(嚴格地說,這樣的變化也算作更改函數的簽名,如其他人所說。)

如果你非常,非常小心,你可以安排在末尾添加新成員一個結構,但它通常需要調用者的明確合作,使用預先定義的機制(即,在版本0之後,所有調用代碼一直堅持,在做出任何更改之前)。