從原始碼編譯對已安裝應用程序的影響
我使用 Ubuntu 12.04。假設我
package x
已從版本 1.7 的儲存庫(及其所有依賴項)安裝,但我需要一些僅在版本 1.8 中可用的功能,因此我下載源 tar 並編譯它:./configure make make install
- 這會覆蓋現有的 1.7 二進製文件嗎?
- 如果現有的二進製文件被覆蓋,包管理器是否反映了新版本(1.8)並且
package x
將來可以由包管理器更新?- 如果
package y
依賴於package x 1.8
- 會滿足嗎?我一直試圖在網上找到一個很好的資源來解釋這一點。如果您有任何建議,請讓我知道。
絕大多數
.deb
軟體包,無論它們是否由官方儲存庫提供,都以前綴/usr
.這意味著打算由使用者執行的執行檔
/usr/bin
或/usr/sbin
(或者/usr/games
如果它是遊戲)、共享庫/usr/lib
、獨立於平台的共享數據/usr/share
、標頭檔/usr/include
和自動安裝的原始碼/usr/src
。一小部分軟體包
/
用作前綴。例如,bash
包將bash
執行檔放入/bin
,而不是/usr/bin
. 這適用於提供在單使用者模式下執行(例如恢復模式)和啟動多使用者模式(但請記住,這通常包括掛載某些類型的網路共享的功能……以防/usr
萬一遠端文件系統)。一小部分
.deb
包,主要是那些使用Quickly創建的包,會在其中創建一個特定於包的文件夾/opt
並將所有文件放在那裡。除此之外,大部分時間/opt
是從可執行安裝程序安裝的軟體使用的位置,該安裝程序不使用系統的包管理器,但不涉及從原始碼編譯。(例如,如果您安裝了 MATLAB 之類的專有程序,您可能會將其放入/opt
.)與所有這些相反,當您下載源存檔(或從 Bazaar 或 git 等修訂控制系統獲取原始碼)、建構並安裝它時,它通常會安裝到前綴
/usr/local
(除非您告訴它這樣做否則)。這意味著您的可執行文件進入/usr/local/bin
、/usr/local/lib
或/usr/local/games
,您的庫進入/usr/local/lib
等等。對此有一些例外 - 預設情況下,某些程序會安裝到
/usr
前綴,因此會覆蓋來自.deb
軟體包的相同程序的安裝。./configure --prefix=/usr/local
通常,您可以通過執行而不是./configure
在建構它們時來防止這種情況。我再次強調,通常這不是必需的。(正是由於這個原因,將您正在建構並將安裝以供系統範圍使用的原始碼放入 中是非常有意義的
/usr/local/src
,它就是為此目的而存在的。)假設打包的版本安裝在
/usr
並且您從源安裝的版本在/usr/local
:
- 安裝包中的文件不會被覆蓋。
通常,當您從命令行手動呼叫程序時,較新的版本將執行(假設
/usr/local/bin
或安裝執行檔的任何位置都在您的PATH
環境變數中,並且出現在相應的/usr
-prefixed 目錄之前,例如/usr/bin
)。但是,通過菜單或搜尋創建和訪問的啟動器可能存在一些問題。此外,如果您在不同位置安裝了多個版本的庫,則確定哪個軟體將使用哪個版本可能會變得更加複雜。
如果您實際上並沒有同時使用程序或庫的兩個版本,那麼您通常應該刪除您不使用的版本,儘管在有限的情況下您可能希望保持安裝包以滿足依賴關係。
但是,如果由於任何原因文件被覆蓋(例如,如果原始碼安裝在
/usr
而不是/usr/local
):
- 包管理器不會知道它安裝的軟體是如何更改的。它會認為已安裝舊版本。可能會導致不好的問題。你應該避免這種情況。如果您已經創建了這種情況,您應該從原始碼(通常
sudo make uninstall
在目錄中)解除安裝您安裝的軟體,然後解除安裝提供被覆蓋文件的一個或多個軟體包(因為解除安裝安裝的版本不會恢復它們)來源)。然後重新安裝您想要的任何版本。/usr/local/src/**program-or-library-name**
至於實現依賴項:
- 如果某個
.deb
軟體包依賴於您從源安裝的軟體,並且需要您從源安裝的版本(或更高版本),則該軟體包將無法成功安裝。(或者,更準確地說,您可能能夠“安裝”它,但它永遠不會被“配置”,因此您將無法使用它。)依賴關係由安裝的軟體包版本解決,而不是由你實際上有什麼軟體。同樣,即使您手動刪除了正在安裝的軟體所依賴的軟體包提供的文件,軟體也至少會嘗試完全安裝。(您通常不應該出於任何目的嘗試利用它。基於虛假資訊操作的包管理器幾乎總是一件壞事。)
因此,如果您找不到提供所需軟體版本的軟體包,您可能需要使用
.deb
已編譯的軟體創建自己的軟體包,然後從該軟體包進行安裝。然後包管理器就會知道發生了什麼。創建一個自己使用的包,不需要在其他人的電腦上很好地工作,實際上並不難。(但我覺得這可能超出了你的問題範圍,因為它目前的措辭。)