簡體   English   中英

C ++:如何創建兩個相互依賴的共享庫?

[英]C++: How to create two interdependent shared libraries?

假設我要將a.cpp和b.cpp編譯為兩個單獨的共享庫liba.so和libb.so,並且這兩個庫是相互依賴的,我該怎么做呢?

盡管我可以想到幾種實現此類目標的方法,但它們都有各自的缺點,並且由於以下原因,整個問題尚無定論。

盡管您沒有明確提及使用的平台,並且共享庫實現的細節是高度特定於平台的,所以在任何情況下,給定共享庫的名稱,此類問題的答案都取決於平台您在問題“ liba.so”和“ libb.so”中提到的,您很可能使用Linux。

當前大多數Linux發行版都配置了其運行時加載程序,以便應用程序只能從應用程序顯式鏈接到的共享庫中解析外部引用。 如果您的應用程序與liba.so鏈接,而liba.so與libb.so鏈接,則您的應用程序將無法解析來自libb.so的外部引用,反之亦然。

因此,由於您的應用程序將明確需要鏈接到兩個共享庫,因此整個問題都沒有解決。 您最好分別構建兩個共享庫,然后將應用程序與兩個共享庫顯式鏈接。 否則,它將無法正常工作。

但是,如果您真的堅持要破解,那么將每個庫彼此明確鏈接就不那么復雜了。 有一個初始引導問題,可以通過虛擬Makefile目標解決。 簡而言之, Makefile可能會讀取如下內容:

liba.so: liba.so-target libb.so-target
    [link command with -llibb.so]

libb.so: libb.so-target liba.so-target
    [link command with -lliba.so]

liba.so-target: [all object modules that build liba.so]
    [link command without -llibb.so]
    touch liba.so-target

libb.so-target: [all object modules that build libb.so]
    [link command without -lliba.so]
    touch libb.so-target

因此,歸根結底,每個共享庫都首先被自身鏈接,然后與另一個庫重新鏈接,而另一個庫的依賴關系也因其依賴而重新鏈接。

這不是100%完美的,這種方法可能會在並行,並行make構建中遇到一些偶然的問題,但這是一般的想法。 我仍然建議,鑒於Linux運行時加載程序的當前配置,您的應用程序必須與兩個庫顯式鏈接,從而使整個事情完全沒有必要。

暫無
暫無

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

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