2013-11-28 77 views
1

幾個月前,我在debian上構建了一個使用libxml2作爲共享庫的C軟件。 我創建了一個用於安裝該軟件的.deb文件,並且Ubuntu用戶可以使其運行。使用不帶版本的共享庫鏈接

今天,最新版本的Ubuntu有更大版本的libxml2。所以現在,該軟件無法運行,它要求使用libxml2的先前版本,並且使其工作的唯一方法是在鏈接新版libxml2時構建軟件。

所以我的問題是,是否有可能鏈接到共享庫而不需要特定版本(考慮到軟件無法在某些版本上運行的風險)?

如果不是,那麼如果您無法在任何Linux發行版上部署您的軟件,那麼與共享庫鏈接的真正優勢是什麼?

感謝您的幫助。

問候, 文森特。

回答

1

大多數共享庫將嵌入SONAME。這SONAME用於表示二進制兼容性。例如,libxml2.so.2.7.8已嵌入libxml2.so.2的SONAME

readelf -Wa libxml2.so.2.7.8 | grep SONAME 
0x000000000000000e (SONAME)    Library soname: [libxml2.so.2] 

如果libxml2.so.2.7.9出來了,它很可能仍然是用二進制兼容v2.7.8 ,並且仍然有libxml2.so.2的SONAME,並且您的應用程序可以正常工作。只有當引入的變更破壞了二進制兼容性時,SONAME纔會增加,從而破壞了您的應用程序。

如果您想要創建一個可以自動處理所有發行版的軟件包,一種方法是提供自己的libxml2版本,然後修改LD_LIBRARY_PATH,以便自動加載您的版本。

+1

「每個共享庫都有一個嵌入式'SONAME'」 - 這個陳述是錯誤的。擁有'SONAME'是一種很好的做法*,但絕不是必需的。 –

+0

謝謝!我更新了我的答案以反映這一點。 –