簡體   English   中英

在Debian軟件包中支持多個Boost版本

[英]Supporting multiple Boost versions in a Debian Package

我正在嘗試為我的項目創建一個debian包,但一直遇到boost版本支持的問題。

確實看了看這個問題。 它是類似的,但提供的解決方案(Build-Depends)並不適用於我,因為我正在制作二進制安裝程序。

基本上,我安裝的庫和可執行文件總是鏈接到libboost_(組件).so.1.46而不是符號鏈接庫libboost_(組件).so。 離開我的debian安裝程序只能由我的確切提升版本的人使用。 我正在使用CPack來制作debian包,我的依賴行看起來像:

SET(CPACK_DEBIAN_PACKAGE_DEPENDS "libboost-dev (>= 1.46),
                                  libboost-thread-dev (>= 1.46),
                                  libboost-signals-dev (>= 1.46),
                                  libboost-system-dev (>= 1.46), 
                                  libboost-filesystem-dev (>= 1.46),
                                  libboost-python-dev (>= 1.46), ..." )

我是否需要為所述平台上的每個平台或該平台的升級版本構建單獨的安裝程序?

雖然我理解你想要創建一個適用於所有升級版本的軟件包的強度,但你真的要問自己這是否真的可行。

.so版本的概念(例如.so.1.46 vs .so.1.48 )實際上是指示庫接口(ABI) 已經改變 ,這基本上表明庫不兼容。

因此,這是極不可能的 ,你的應用程序鏈接到的libboost_foo.so.1.46將實際工作與libboost_foo.so.1.48 很可能,您的應用程序所需的符號突然消失(因此您的應用程序將拒絕啟動)。 更糟糕的是,可能是版本之間符號的含義發生了變化,導致很難跟蹤未定義的行為。

這就是為什么每當你鏈接libfoo.so ,二進制文件真的鏈接libfoo.so.1 (或libfoo.so真正指向的地方)

現在debian策略是,包名稱必須針對任何不兼容的ABI更改進行更改。 這基本上允許用戶同時安裝相同庫的兩個版本(例如boost-1.46和boost-1.49)。

如果您要定位特定版本的Debian,您可以確保可以使用特定版本的庫。 例如在Debian / wheezy上你將獲得提升-1.49。 因此,如果你提供Debian / wheezy的軟件包,你只需要鏈接boost-1.49。 這也是發行版如此出色的原因之一:它保證了所有需要的lbiraries都可用。

它還意味着,即使沒有“上游”版本,你也可以在多個Debian版本中擁有相同應用程序的不同軟件包版本:由於依賴項的升級(涉及soname更改),必須重新構建軟件包

所以得出結論:

  • 鏈接到實際的庫版本是一個讓您的系統保持理智的功能

  • debian允許同時安裝同一個庫的多個版本

解決您的問題:

  • 為任何依賴項的每個soname版本提供二進制包

為每個debian 版本提供軟件包將使它比看起來更麻煩(因為每個版本只有一組固定的庫)。

你可以嘗試做的是靜態鏈接boost包:

set(Boost_USE_STATIC_LIBS ON)

暫無
暫無

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

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