2016-02-11 54 views
8

我在使用自制軟件方面很新穎,我想弄清楚它是如何在我自己的項目中使用一些庫(例如boost,gsl,openblas)。爲什麼Homebrew創建一個/ usr/local/opt目錄並且應該使用它?

我知道每個公式都是由Homebrew在/ usr/local/Cellar /中安裝的,然後在usr/local/bin,usr/local/lib,usr/local/include中進行symlink,因此它似乎只有桶的公式,所以它不會混淆操作系統已經安裝的庫(例如參見Understand homebrew and keg-only dependencies)。但是我發現每個公式都鏈接到/ usr/local/opt目錄。所以我的問題是爲什麼有這個/ usr/local/opt目錄(這是多餘的),我必須使用什麼路徑來使用公式(usr/local/Cellar或usr/local /或usr/local/opt基本上)?

回答

17

它提供了一個公式內容的路徑,它不會因版本升級而改變。

請考慮這種情況:假設您使用Homebrew構建libfoo.dylib。它是2.0.0版本,所以它的生命在/usr/local/Cellar/libfoo/2.0.0/lib/libfoo.dylib。你想從另一個正在建立的程序鏈接到它,所以你通過-L/usr/local/Cellar/libfoo/2.0.0/lib -lfoogcc。你的程序編譯。稍後,您升級到libfoo 2.0.1並刪除v2.0.0。現在/usr/local/Cellar/libfoo/2.0.0/lib/libfoo.dylib不再存在,並且您的程序不再運行,因爲它不能動態加載libfoo。

沒關係。 libfoo.dylib也可在/usr/local/lib/libfoo.dylib。這是libfoo最新版本的符號鏈接,所以它應該始終存在。所以你通過-L/usr/local/lib -lfoo到你的程序並編譯它。稍後您升級到libfoo 2.0.1。沒問題,因爲/usr/local/lib/libfoo.dylib仍然存在,並指向v2.0.1副本。

這很棒,而且Homebrew只用那個系統存在了一段時間。問題是,一些公式是「桶只」,所以他們沒有從/usr/local符合鏈接。 (一般來說,它們只是因爲它們影響OS X附帶的庫的版本,並且取代OS X庫會導致問題。)假設您想鏈接到庫的僅桶版本。它不是從/usr/local/lib符號鏈接的,所以你必須給出安裝在/usr/local/Cellar中的版本的完整路徑,這會回到上面列出的第一個問題。

/usr/local/opt解決了這個問題。它爲當前版本的所有公式提供了符號鏈接的位置,而不管它們是否僅僅是小桶。現在,當你想編譯你的程序時,你可以使用-L/usr/local/opt/libfoo/lib -lfoo,並且你的程序將鏈接到libfoo的最新版本,即使你升級了它,即使它只是桶。

+0

謝謝您的回答! (並且幫助我重新解答這個問題)所以我猜最安全的選擇是總是使用/ usr/local/opt,但是爲什麼Homebrew仍然使用/ usr/local/lib來創建非桶的符號鏈接? –

1

只是爲了補充mipadi的答案。

從恰當地命名的文章「/usr/local/opt

中的相應位置存儲文件是保持 系統的清潔和維護的重要組成部分。在大多數Linux系統上,軟件的大多數 都是使用軟件包管理器安裝的。軟件包管理器 會跟蹤已安裝的文件,因此它可以更新和刪除最小副作用的軟件。

但是,有些時候,如果軟件不通過 可用,則必須安裝軟件包管理器。爲了儘量減少 文件系統的副作用,此類軟件安裝在/ usr/local 目錄中。 UNIX風格的軟件安裝將文件放入本地根目錄下的bin, lib,share等子目錄中,但將軟件安裝到特定於軟件包的目錄中很常見,並且從本地根目錄添加 軟鏈接通常是 。這樣做可以輕鬆刪除軟件 - 只需刪除特定於軟件包的目錄 以及指向它的任何鏈接即可。

某些軟件提供了本地安裝說明,可以促進 直接在/ usr/local中創建特定於軟件包的目錄。此 不會促進良好的組織,因爲它將UNIX分層結構 目錄與特定於軟件包的目錄混合在一起。將 軟件安裝到特定於軟件包的目錄中已經在/ opt目錄中的其他地方執行了 ,因此,遵循 相同的約定並將本地安裝的軟件包特定的 目錄放入/ usr/local/opt目錄。

不需要在目錄名稱中包含版本號,但 本地安裝的軟件是一種很好的做法,因爲它允許同時安裝和測試多個版本的 。要運行 特定版本的軟件,請直接在包 目錄下運行可執行文件。通過控制 哪個可執行文件鏈接到/ usr/local/bin,可以使任何版本成爲默認版本。例如,可以在不刪除舊版本的情況下安裝和測試新的軟件版本。當新版本準備就緒時,可以更新/ usr/local/bin中的鏈接以指向它。舊版本的軟件可在 不再需要時刪除。

來源:版權所有©2014 Extellisys

相關問題