2011-07-07 94 views
1

我有一個非常小的庫,我想轉向一個靜態庫(libx.a),但該庫依賴於動態庫(liby.so)。我希望能夠「預先鏈接」我的靜態庫,以便libx.a已經包含對liby.so的引用。將動態庫鏈接到一個靜態庫(又名預鏈接動態庫)

這基本上允許我在編譯程序的時候不指定選項-ly當-lx存在。與libx鏈接時,這使得事情更簡單,特別是如果依賴於許多共享庫。

可能嗎?如果是,如何(假設gcc)?

如果可能的話,如果使用libx的程序本身使用liby,會不會有某種有趣的重複(我想是可變的)呢?

回答

1

我很困惑你是否真的想將共享庫代碼包含到靜態庫存檔中,或者是否只想將其合併到靜態庫中,並自動創建對共享庫的引用。

在前一種情況下,我知道沒有工具可以做,但它應該是一個可解決的問題。如果您花一些時間閱讀ELF規範,則可以製作一個工具將.so文件轉換爲正常的.o文件,然後將.o文件包含在.a存檔中。

在後一種情況下,大多數人用pkg-config來解決這個問題。另一種方法是GNU特定的,它將安裝一個GNU鏈接描述文件而不是原始的.a文件,並讓鏈接描述文件引用你的靜態庫和所需的共享庫。

+0

我的意思是後者。謝謝,我會看看pkg-config :) – Norswap

0

這裏的問題是,你的動態庫是編譯位置無關的,需要一個動態加載器來在加載時修復內部和外部引用。因此你不能顯式鏈接到一個動態庫。在我正在研究的項目中,我們通常編譯庫的靜態和動態版本,這是其中一個原因。

+0

我明白這一點,但是當你對一個動態鏈接庫的可執行文件,該動態負載也需要發生。 我的意思是不刪除動態加載步驟,而只是直接將動態庫的引用添加到靜態庫。然後,如果我們將可執行文件與靜態庫鏈接並運行,則需要解析靜態庫中對動態庫的引用。 – Norswap

+0

這不是一個基本的問題。 '.so'中面向動態鏈接的重定位當然可以在靜態鏈接時解決......沒有任何關於PIC代碼阻止它重新定位到固定位置的問題。 –

0

該問題可以通過使用智能構建系統來解決。我可以推薦使用gyp。它有一個靜態庫的選項link_settings

{ 
    'targets': [ 
    { 
     'target_name': 'x', # will generate libx.a 
     'type': 'static_library', 
     'sources': [], 
     'link_settings': { 
     'libraries': ['-ly'], 
     }, 
    }, 
    { 
     'target_name': 'test', 
     'type': 'executable', 
     'dependencies': ['x'], 
     'sources': [], 
    }, 
    ], 
}