Zawiera ścieżkę do treści formuły, która nie zmienia się w przypadku aktualizacji wersji.
Rozważmy następujący scenariusz: Załóżmy, że zbudowaliśmy libfoo.dylib
z Homebrew. Jest to wersja 2.0.0, a więc żyje w /usr/local/Cellar/libfoo/2.0.0/lib/libfoo.dylib
. Chcesz połączyć się z nim z innego budowanego programu, aby przekazać -L/usr/local/Cellar/libfoo/2.0.0/lib -lfoo
do gcc
. Twój program się kompiluje. Później uaktualnisz do libfoo 2.0.1 i usuniesz v2.0.0. Teraz /usr/local/Cellar/libfoo/2.0.0/lib/libfoo.dylib
już nie istnieje, a Twój program nie działa, ponieważ nie może dynamicznie ładować libfoo.
W porządku. libfoo.dylib
jest również dostępny pod adresem /usr/local/lib/libfoo.dylib
. Jest to dowiązanie symboliczne do najnowszej wersji libfoo, więc zawsze powinno być obecne. Przekazujesz -L/usr/local/lib -lfoo
do swojego programu i kompilujesz go. Później uaktualnisz do libfoo 2.0.1. Nie ma problemu, ponieważ /usr/local/lib/libfoo.dylib
jest nadal obecny i wskazuje na kopię v2.0.1.
To świetnie, a Homebrew istniał z tym systemem przez jakiś czas. Problem polega na tym, że niektóre formuły są "tylko w keg", więc nie są one połączone dowiązaniem symbolicznym z /usr/local
. (Zwykle są one tylko w keg, ponieważ śledzą wersję biblioteki dostarczanej z systemem OS X, a zastąpienie bibliotek OS X może powodować problemy). Powiedz, że chcesz utworzyć łącze do wersji biblioteki tylko w wersji beczkowej. Nie jest on połączony symbolicznie z /usr/local/lib
, więc musisz podać pełną ścieżkę do wersji zainstalowanej w /usr/local/Cellar
, która przywraca cię do pierwszego problemu wymienionego powyżej.
/usr/local/opt
rozwiązuje ten problem. Zapewnia miejsce dla obecnej wersji wszystkich formuł do dowiązania symbolicznego, niezależnie od tego, czy są one tylko keg-czy nie. Teraz, gdy chcesz skompilować swój program, możesz użyć -L/usr/local/opt/libfoo/lib -lfoo
, a twój program połączy się z najnowszą wersją libfoo, nawet jeśli ją zaktualizujesz, a nawet jeśli jest to tylko keg-only.
Dziękuję za odpowiedź! (i za pomoc w ponownym otwarciu tego pytania). Sądzę więc, że najbezpieczniejszym wyborem jest zawsze używać/usr/local/opt, ale dlaczego Homebrew nadal używa/usr/local/lib do tworzenia dowiązań symbolicznych dla nie-beczek? –