Ubuntu

從原始碼編譯對已安裝應用程序的影響

  • May 1, 2013

我使用 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已編譯的軟體創建自己的軟體包,然後從該軟體包進行安裝。然後包管理器就會知道發生了什麼。創建一個自己使用的包,不需要在其他人的電腦上很好地工作,實際上並不難。(但我覺得這可能超出了你的問題範圍,因為它目前的措辭。)

引用自:https://unix.stackexchange.com/questions/46656