2010-11-19 94 views
2

我已經創建了一個動態庫(.so),它捆綁了我需要的存儲後端的一些功能。
由於它是,它提供了一個已知的接口,並提供的東西像memcached的,MySQL和SQLite的...等後端如何處理共享庫中的依賴關係,unix

現在我的問題是,我的共享庫依賴於libmemcached,在libsqlite3上的libmysqlclient ..等等,我不知道如何打包,因爲只需要sqlite的客戶端不需要安裝libmemcached。

我一直在考慮在不同的庫上分割它,但它似乎最終會有近20個.so庫,我不喜歡這個想法。

還可以嗎?

回答

3

一種替代方法是在您創建的共享庫中放置一個接口,從而允許它在運行時加載依賴關係。因此,作爲一個例子,你可以有單獨的 初始化功能不同的組件:

init_memcached(); 
init_sqlite(); 

您實現使用dlopen()和朋友這些初始化函數。

0

你可能只在運行時加載需要的共享庫,但在我看來,它不是那麼好的方法。

我會拆分共享庫,但不是分成20個庫。看看你是否可以分組一些常見的功能。

+0

我很好奇 - 爲什麼不考慮第一種方法? – Sudhanshu 2010-11-19 12:52:31

+0

@Sudhanshu該方法的問題是你必須得到每個需要的函數的地址,它對c工作正常,但對於C++,它需要一些雜耍(例如提供創建和刪除對象的功能)。 – 2010-11-19 12:56:54

2

您可以使用dynamic loading使用dlsymdlopen。 這種方法的優點是,當客戶端沒有找到共享庫時,您的應用程序可以正常運行。