簡體   English   中英

鏈接到靜態庫的多個版本

[英]linking to multiple versions of a static library

我的項目鏈接到靜態庫libA.a版本1。

此可執行文件還鏈接到另一個靜態庫B. B鏈接到A,但版本2。

A的版本1和2中的兩個符號集都是相同的。 如果我知道在我的項目和B之間沒有任何東西與A有任何關系,這應該可行嗎?

我設法手動鏈接它似乎工作(也許有我不知道的陷阱)。

我不能使lib B成為共享對象,或者使用A作為共享對象。 實際上,我只知道B正在靜態使用A,因為我和寫過B的人談過。

我有待糾正,但似乎你可以通過仔細的編譯過程和明智地使用objcopy來完成你想要的。 您應遵循的步驟是:

  1. 編譯A的版本2
  2. 針對A2編譯庫B.
  3. 將B和A2合並到單個庫C中(有關相關討論,請參閱此頁 )。
  4. 通過使用objcopy創建C2來本地化來自A2中的所有符號。 使用objcopy --localize-symbols infile outfile ,並在此處查看詳細信息。
  5. 編譯A的版本1
  6. 編譯您的應用程序(P)。
  7. 鏈接P A1和C2。

我在實踐中從未這樣做過,但所有構建模塊似乎都已到位。 第4步是最難的,因為你必須識別所有沖突的符號 - 可能是手動的。

關於問題的“鏈接”部分,實際上靜態庫沒有鏈接在一起。 僅執行鏈接步驟以獲得最終可執行文件。

實際上,您使用A(版本2)的標頭編譯了靜態庫B. 然后,您將可執行文件與B和A(版本1)庫鏈接。

只要兩個版本的A中的符號相同,就沒有編譯問題。 但是你必須知道你的可執行文件實際上只嵌入並使用了A的版本1。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM