2012-09-18 43 views
1

在我的開源項目Artha中,我使用libnotify來向用戶顯示被動桌面通知。查找共享庫名稱以與dlload一起使用

而不是靜態鏈接libn​​otify,通過dlload在運行時查找共享對象(.so)文件(如果目標機器上可用),Artha在其GUI中公開通知功能。在應用上。開始時,調用dlload,文件名參數爲libnotify.so.1,如果它返回一個非空指針,則該特徵將被公開。

這種模式的一個反覆出現的問題是,每次圖書館的版本號被碰撞時,Artha的代碼都需要更新,目前libnotify.so.4是引發這種情況的最新版本。

是否有一個linux系統調用(不管應用程序運行在哪個發行版),它可以告訴我特定庫的共享對象是否在運行時可用?我知道存在從1到10的枚舉庫的強力選項,我覺得這個解決方案醜陋而且不夠優雅。

此外,如果這可以通過autoconf解決,那麼也可以解決這個問題,也就是說,在構建時,基於目標機器,所產生的configure.h應該有權傳遞給dlload

P.S:我認爲好的發行版遵循創建鏈接到libnotify.so.x的風格,使程序員可以做dlload("libnotify.so", RTLD_LAZY)和正確的版本號。所以是加載;不幸的是,並非所有的發行版都遵循這一點,包括Ubuntu。

+0

[相關問題](http://stackoverflow.com/questions/2827181/dynamic-loading-of-shared-objects-using-dlopen)。 – legends2k

回答

1

答案是:你沒有。

dlopen()不是爲了處理類似的事情而設計的,並且試圖加載你在系統上找到的任何一個soversion只是因爲它碰巧有你需要的符號不是一個好的方法來做到這一點。

不同的sonames有不同的ABIs,而不同的ABIs意味着你可能會調用相同的確切符號名稱,這些名稱需要一個不同的參數設置(或不同大小),這會導致崩潰或非常困難的錯誤行爲。

您應該閱讀how shared object versions workwhat an ABI is

libfoo.so鏈接用於鏈接編輯器(ld),並且通常與-devel包一起安裝;它也可能不是一個鏈接,而是一個帶有鏈接腳本的文本文件,通常是有意避免你正在嘗試做的事情。

+0

感謝您的回答,我會閱讀文章! – legends2k