Zmienna środowiskowa PKG_CONFIG_PATH

74

Rozważ dostosowanie zmiennej środowiskowej PKG_CONFIG_PATH, jeśli oprogramowanie zostało zainstalowane w niestandardowym prefiksie. Co to znaczy ?

MKJ
źródło
1
Prawie zapytałbym o to w ten sam sposób, z tym wyjątkiem, że mógłbyś poprosić o przykłady prawidłowego użycia zmiennej środowiskowej PKG_CONFIG_PATH, np. „Co to jest i jak z niej korzystać?” Wygląda na to, że odpowiedzi, które otrzymałeś, próbowały ci to powiedzieć. Często widzę ten program podczas ./configure, gdy nie można znaleźć zależności.
Douglas G. Allen

Odpowiedzi:

68

PKG_CONFIG_PATHto zmienna środowiskowa, która określa dodatkowe ścieżki, w których pkg-configbędą wyszukiwać swoje pliki .pc.

Ta zmienna służy do rozszerzenia domyślnej ścieżki wyszukiwania pkg-config. W typowym systemie uniksowym przeszuka katalogi /usr/lib/pkgconfigi /usr/share/pkgconfig. Zazwyczaj dotyczy to modułów zainstalowanych w systemie. Jednak niektóre lokalne moduły mogą być zainstalowane w innym prefiksem takich jak /usr/local. W takim przypadku konieczne jest dodanie ścieżki wyszukiwania, aby pkg-config mógł zlokalizować pliki .pc.

pkg-configProgram służy do pobierania informacji o zainstalowanych w systemie bibliotek. Podstawowym zastosowaniem pkg-configjest dostarczenie niezbędnych szczegółów do kompilacji i połączenia programu z biblioteką. Te metadane są przechowywane w plikach pkg-config. Pliki te mają sufiks .pc i znajdują się w określonych lokalizacjach znanych narzędziu pkg-config.

Aby sprawdzić PKG_CONFIG_PATHwartość, użyj tego polecenia:

echo $PKG_CONFIG_PATH

Aby ustawić PKG_CONFIG_PATHwartość, użyj:

export PKG_CONFIG_PATH=/usr/lib/pkgconfig

lub

export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig
devav2
źródło
@NathanKidd Dziękujemy za przypomnienie, komentarz został usunięty. Wygląda na to, że pierwotny błąd wynikał z nieoryginalnej edycji autora.
Timothy Gu,
@remram wygląda na to, że błędy zostały już naprawione, ale twój komentarz pozostawia ludzi zdezorientowanych, jeśli nie zbadają dokładnie historii edycji. Czy możesz sprawdzić, czy jesteś zadowolony z aktualnej dokładności, a może usunąć komentarz? (I usunę moje.)
Nathan Kidd,
@ devav2 oba polecenia eksportu nie rozwiązują problemu
Shayan
38

Pierwsza odpowiedź nie jest wystarczająco precyzyjna z technicznego punktu widzenia. Ze strony podręcznika (otwórz terminal, wpisz man pkg-config):

pkg-configpobiera informacje o pakietach ze specjalnych plików metadanych. Te pliki są nazwane na cześć pakietu i mają .pcrozszerzenie. W większości systemów, pkg-config wygląda na /usr/lib/pkgconfig, /usr/share/pkgconfig, /usr/local/lib/pkgconfigi /usr/local/share/pkgconfigdla tych plików. Dodatkowo zajrzy do listy katalogów określonych przez PKG_CONFIG_PATHzmienną środowiskową, oddzieloną dwukropkami (w systemie Windows, oddzieloną średnikami) .

Tak więc pkg-configprogramu nie ma w PKG_CONFIG_PATHkatalogu; Jeśli jednak zainstalujesz bibliotekę, aby informacja o tym, że automakemogła być dostępna w skrypcie, była dostępna, musi znajdować się w katalogu pkg-config.

Ian Martin
źródło
Kluczowe zdanie wydaje się być „w większości systemów”. Na przykład w moim Debianie zostajemy /usr/local/lib/x86_64-linux-gnuwrzuceni jako automatyczna lokalizacja wyszukiwania za darmo (z pustym PKG_CONFIG_PATH) i rzeczywiście, wiele .pcplików - godne uwagi, w tym GTK + i in. - żyć tutaj. Powodem tego jest jednoczesne włączenie pakietu dla wielu architektur, jak opisano tutaj: askubuntu.com/questions/449348/…
underscore_d
(nie można już edytować) @GrandAdmiral w odpowiedzi poniżej tej strony pokazał, jak sprawdzić domyślne ścieżki, które pkg-configbędą wyszukiwać w twoim systemie: askubuntu.com/a/373217/436580
underscore_d
35

Aby zobaczyć, gdzie pkg-config (wersja 0.24 lub nowsza) domyślnie szuka zainstalowanych bibliotek, użyj następującego polecenia:

pkg-config --variable pc_path pkg-config

Aby zmodyfikować tę ścieżkę, ustaw PKG_CONFIG_PATHzmienną środowiskową. Stan pliku man PKG_CONFIG_PATHto:

Rozdzielona dwukropkami (w systemie Windows, oddzielona średnikami) lista katalogów do wyszukiwania plików .pc. Domyślny katalog będzie zawsze przeszukiwany po przeszukaniu ścieżki; wartość domyślna to libdir / pkgconfig: datadir / pkgconfig gdzie libdir to libdir, gdzie pkg-config i datadir to datadir, w którym zainstalowano pkg-config.

GrandAdmiral
źródło
3
przydatnym skryptem będzieecho $(pkg-config --variable pc_path pkg-config)${PKG_CONFIG_PATH:+:}${PKG_CONFIG_PATH}
albfan
5
To świetna odpowiedź, która mi pomogła. Jednak, aby to wyjaśnić, powinieneś powiedzieć „Aby dodać do tej ścieżki” zamiast „Aby zmodyfikować”, ponieważ można mieć puste PKG_CONFIG_PATHi nadal mieć domyślnie przeszukiwane katalogi, a ustawienie niepustej wartości nie usuwa domyślnych wartości.
underscore_d
Ta odpowiedź była dla mnie bardzo przydatna, dzięki! Próbowałem dowiedzieć się, jaka była domyślna ścieżka wyszukiwania dla pkg-config, ponieważ moja jest zainstalowana z Linuxbrew, więc domyślne ścieżki nie istnieją. Dzięki!
mxplusb
6

Próbujesz zbudować oprogramowanie, powiedzmy Widget. Widget opiera się na innej bibliotece, libcog ze względu na argument. Proces budowania widżetu (prawdopodobnie skrypt konfiguracyjny) używa pkg-config do określenia, jak korzystać z libcog. pkg-config nic nie wie o libcog.

Jeśli libcog nie jest zainstalowany, to jest twój problem. Istnieje duża szansa, że ​​standardowa instalacja libcog rozwiąże problem. W zależności od systemu może być konieczne zainstalowanie dodatkowej wersji „deweloperskiej” pakietu; często ma na końcu „-devel” lub „-dev”, więc jeśli zainstalujesz „libcog”, być może będziesz musiał zainstalować „libcog-devel”.

Jeśli libcog jest zainstalowany, prawdopodobnie nie jest zainstalowany w taki sposób, aby mógł go znaleźć pkg-config. Prawdopodobnie gdzieś w systemie jest plik libcog.pc. Dla celów argumentu jest to na /opt/cog/lib/pkgconfig/libcog.pc. W takim przypadku możesz powiedzieć pkg-config o tym, ustawiając PKG_CONFIG_PATH na katalog zawierający libcog.pc. Więc w skorupce Bourne'a lub podobnej, coś w tym rodzaju

export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/opt/cog/lib/pkgconfig/

Po wykonaniu tej czynności ponowne uruchomienie polecenia, które się nie powiodło, będzie działać.

Jeśli zainstalowano libcog, w tym biblioteki i pliki nagłówkowe, a nie masz pliku libcog.pc, wszystko idzie źle. Przypuszczalnie standardowa instalacja libcog zawiera informacje, w przeciwnym razie Widget nie polegałby na nich. Najpierw zbadam ponowną instalację libcog. Możliwe jest ręczne utworzenie pliku libcog.pc, ale jego poprawne wykonanie jest trudne i bardzo specyficzne dla danej biblioteki.

Alan De Smet
źródło
4
Jedna rzecz - co jeśli zdefiniowano PKG_CONFIG_PATH - to nadpisze to poprawnie?
NoBugs,
1
@NoBugs dobry haczyk, edytowałem odpowiedź (kilka lat później!), Aby zamiast tego dołączyć.
Joe Malt
5

Spojrzałem na stronę podręcznika w moim 64-bitowym systemie i byłem trochę zdezorientowany. Powiedział w jednym wierszu:

pkg-config pobiera informacje o pakietach ze specjalnych plików metadanych. Pliki te są nazwane na cześć pakietu z rozszerzeniem .pc. Domyślnie pkg-config szuka tych plików w prefiksie katalogu / lib / pkgconfig; będzie również szukał na liście katalogów określonych w zmiennej środowiskowej PKG_CONFIG_PATH rozdzielonej dwukropkami (w systemie Windows, rozdzielonej średnikami).

Założyłem, że tak też wygląda w katalogach lib / pkgconfig. Okazuje się, że same katalogi. W moim przypadku próbowałem skompilować samouczek GTK hello world. Znajduję plik, który chcę np

locate gtk | grep '\.pc'

Wśród wyników są:

/usr/lib/x86_64-linux-gnu/pkgconfig/gtk+-3.0.pc

Wreszcie miał zrobić eksport.

export PKG_CONFIG_PATH=/usr/lib/x86_64-linux-gnu/pkgconfig/
możliwe klucze
źródło
1
+1 za wskazanie, w jaki sposób manstrona upraszcza w przypadku nowoczesnych systemów obsługujących wiele architektur. Przez pewien czas byłem zdezorientowany, ponieważ na Debianie 8 x86 pkg-configjuż szuka w folderze x86_64 (bez niczego PKG_CONFIG_PATH). Nie jestem pewien, jak to zostało włączone, ale linia poleceń do sprawdzenia tego pokazana przez @GrandAdmiral wskazuje, że jest kontrolowany przez to, --variable pc_pathktóre jest ustawione (jakoś!) Dla pkg-configwłasnego pakietu.
underscore_d
5

Wydaje mi się, że większość odpowiedzi zawiera za dużo informacji, niż jest to potrzebne.

Oprogramowanie, które się instaluje, może (i zwykle robi) polegać na niektórych bibliotekach i / lub nagłówkach, a System używa pkg-config do ich znalezienia.

Mówiąc tak, pkg-configszuka tych plików w predefiniowanych (domyślnych) katalogach systemowych. Te foldery mają „prefiks”. Np. Biblioteka z prefiksem /usr/localpowinna mieć nagłówki /usr/local/include, a sama biblioteka będzie w /usr/local/lib. pkg-config szuka bibliotek również w katalogu wymienionym w zmiennej środowiskowej PKG_CONFIG_PATH .

Następnie, jeśli instalujesz oprogramowanie poza domyślną listą folderów, musisz „dostosować” listę, a mianowicie dodać swoje katalogi do PKG_CONFIG_PATH

$ export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:<your-directory>

Aby uzyskać więcej informacji, możesz zajrzeć tutaj i tutaj

klobrano
źródło
PKG_CONFIG_PATHokreśla dodatkowe katalogi, w których można wyszukiwać tylko pliki yourPkg.pc( pkg-configspecyfikacji). Nie wpływa na rzeczy specyficzne dla pkg, takie jak katalogi wyszukiwania bibliotek.
underscore_d
1

Oznacza to, że próbujesz zbudować coś ze źródła i nie może znaleźć wszystkich potrzebnych zależności. pkg-configSkrypt korzysta znaleźć pliki rozwoju dla tych bibliotek, wysyła ten komunikat.

dobey
źródło
0

Próbowałem zainstalować najnowszą wersję Axela i pobiegłem ./configurei otrzymałem to:

configure: error: Package requirements (openssl) were not met:

No package 'openssl' found

Consider adjusting the PKG_CONFIG_PATH environment variable if you
installed software in a non-standard prefix.

Alternatively, you may set the environment variables SSL_CFLAGS
and SSL_LIBS to avoid the need to call pkg-config.
See the pkg-config man page for more details.

Więc próbowałem:

$ pkg-config --cflags openssl

i mam:

Package openssl was not found in the pkg-config search path.
Perhaps you should add the directory containing `openssl.pc'
to the PKG_CONFIG_PATH environment variable
No package 'openssl' found

Jak oczywiste miałem zainstalowany openssl ( sudo apt-get install openssl) Ale na powyższym wyjściu, jak widać, napisano: „Nie znaleziono pakietu” openssl „znaleziony”. Aby upewnić się, że zrobiłem:

find / -type f -name "*.pc" |& grep -iv permission | grep openssl

Okazuje się, że na pewno potrzebuję innego pakietu, więc trochę googling i okazało się, że musiałem zainstalować ten pakiet:

sudo apt-get install libssl-dev

A wszystko to nie miało nic wspólnego ze zmianą zmiennej env pkg-config path.

Shayan
źródło