2017-09-23 194 views
1

在編寫共享庫時,通常建議隱藏所有內部符號以減少動態鏈接時間,通常使用鏈接描述文件或-fvisibility選項。將靜態庫鏈接到共享庫時應該隱藏符號嗎?

  • 內部靜態庫
  • 第三方靜態庫(例如,libuv)

所有:

在我的情況下,共享庫兩種類型的其他庫的鏈接使用-Wl,--whole-archive選項將它們鏈接到共享庫中,以便生成的共享庫自足並且僅鏈接到stdlib。

來自內部靜態庫的所有符號都是隱藏的,因爲它們不是公共API的一部分。

問題是隱藏來自第三方靜態庫的符號有什麼優點和缺點?是否有最佳做法和已知的陷阱?一方面,它們不是我圖書館的公共API的一部分。另一方面,它們是第三方庫的公共API的一部分。

我猜想用戶想要鏈接到另一個版本的同一個第三方庫時會出現問題。理論上隱藏它的符號可能會解決它們,但它認爲在實踐中它可能會導致一些新的意想不到的問題。

回答

1

在我看來,你應該隱藏所有不屬於你的API的符號。您似乎還需要一個選項--exclude-libs,ALL將第三方靜態庫符號轉換爲隱藏符號。我不知道任何解決方案的缺點,它加快了動態鏈接器,也沒有看到任何缺點進一步靜態鏈接與另一個庫版本..因爲它的靜態鏈接不動態鏈接(熱交換或如此)。