例如,我可以在頭文件中添加新功能,而無需重新編譯使用該庫的所有程序?可在.so庫中更改哪些內容而不破壞兼容性
0
A
回答
1
您可以將函數和對象添加到共享庫,而不會破壞依賴該庫的現有程序。在某些情況下,您可以增加庫中對象的大小(特別是數組)。
如果函數簽名沒有改變,您也可以替換函數的實現。這不會導致動態鏈接的任何問題,但是如果新實現的行爲不符合現有程序的期望,那麼您會看到程序不當行爲。
您可以刪除沒有程序鏈接到的函數和對象。如果您只關注現有的程序,那麼您可能能夠對這些功能和對象進行編目,但除此之外,您只能對共享庫中功能/對象的可見性進行評估 - 可見的功能和對象不能安全地被刪除。
可能還有其他實現特定的共享庫細節,可以在不中斷兼容性的情況下進行更改。
但是,請注意,沒有任何東西與頭文件直接有關。共享庫的兼容性主要是運行時間的考慮。頭文件僅在編譯時相關。
0
另一點是你必須非常小心任何共享結構。如果庫中的函數接受或返回結構或指向結構的指針,並且如果對該結構進行了任何更改(添加,刪除或重新排列成員),則可能會引入不兼容性。
(嚴格地說,這樣的變化也算作更改函數的簽名,如其他人所說。)
如果你非常,非常小心,你可以安排在末尾添加新成員一個結構,但它通常需要調用者的明確合作,使用預先定義的機制(即,在版本0之後,所有調用代碼一直堅持,在做出任何更改之前)。
相關問題
- 1. 更改列的內容而不破壞格式化
- 2. 共享庫:在不破壞API兼容性的情況下打破ABI兼容性
- 3. VB6的ActiveX停止破壞兼容性
- 4. 清除Winforms GroupBox而不破壞內容
- 5. OSGI庫中可包含哪些內容
- 6. 不兼容的庫版本puma_http11.so
- 7. 在Present()鉤子中繪製而不破壞現有內容
- 8. 不要破壞div內的內容
- 9. 是否可以添加新的ProtoInclude屬性不會破壞向後兼容性
- 10. 使用的是iOS 5功能,而不會破壞向後兼容性
- 11. 從兼容性添加/更改兼容性SimpleMenu/MenuItem片段
- 12. appcompat更新後在Play商店中破壞了Android應用兼容性
- 13. 在平臺配置之間切換會破壞COM兼容性
- 14. JavaScript兼容性庫
- 15. 我可以向List成員添加[XmlElement]屬性而不破壞向後兼容性嗎?
- 16. 使用FragmentTabsPager兼容性庫示例時,我會在選項卡內替換哪些內容?
- 17. 在程序兼容性庫
- 18. 破碎的向後兼容性在System.Web.Http
- 19. 添加枚舉值會破壞二進制兼容性嗎?
- 20. 爲什麼java.sql.Statement會破壞向後兼容性?
- 21. 組合兩個表而不破壞原始列的內容
- 22. 如何選擇清除表格內容而不破壞表格?
- 23. 在不破壞向後兼容性的情況下將返回類型從Integer更改爲int
- 24. 修改「元組列表」結構中的某些內容而不破壞python中的結構
- 25. 動態庫(.so)版本的兼容性版本
- 26. 在不破壞向後兼容性的情況下集成報亭
- 27. 我可以更改損壞的C++ DLL導出符號嗎? (兼容二進制但源代碼不兼容)
- 28. 更改CoreData型號:復古兼容性
- 29. iOS 7更改PNG兼容性/處理?
- 30. Eregi preg_replace更改爲PHP 5.3兼容性
經驗法則:允許添加,但刪除不允許。 – Downvoter
只有頭* * *? –
@Downvoter是正確的,但我想補充一點,重要的問題是每個導出的符號都應該保持導出並指向完全相同的數據類型,即不要更改現有函數的簽名。 –