Umgebungsvariable PKG_CONFIG_PATH

74

Überlegen Sie, ob Sie die Umgebungsvariable PKG_CONFIG_PATH anpassen möchten, wenn Sie Software in einem nicht standardmäßigen Präfix installiert haben. Was bedeutet das ?

MKJ
quelle
1
Ich würde dies fast genauso fragen, außer dass Sie nach Beispielen für die ordnungsgemäße Verwendung der Umgebungsvariablen PKG_CONFIG_PATH gefragt hätten, wie "Was ist das und wie verwende ich es?" Anscheinend haben die Antworten, die Sie erhalten haben, versucht, Ihnen dies zu sagen. Ich stelle fest, dass dies häufig während ./configure angezeigt wird, wenn keine Abhängigkeiten gefunden werden.
Douglas G. Allen

Antworten:

68

PKG_CONFIG_PATHist eine Umgebungsvariable, die zusätzliche Pfade angibt, in denen pkg-confignach ihren .pc-Dateien gesucht wird.

Diese Variable wird verwendet, um den Standardsuchpfad von pkg-config zu erweitern. Auf einem typischen Unix-System wird in den Verzeichnissen /usr/lib/pkgconfigund gesucht /usr/share/pkgconfig. Dies gilt normalerweise für vom System installierte Module. Einige lokale Module können jedoch in einem anderen Präfix installiert sein, z /usr/local. In diesem Fall muss der Suchpfad vorangestellt werden, damit pkg-config die .pc-Dateien finden kann.

Das pkg-configProgramm wird zum Abrufen von Informationen zu installierten Bibliotheken im System verwendet. Der Hauptzweck von pkg-configist, die notwendigen Details zum Kompilieren und Verknüpfen eines Programms mit einer Bibliothek bereitzustellen. Diese Metadaten werden in pkg-config-Dateien gespeichert. Diese Dateien haben das Suffix .pc und befinden sich an bestimmten Orten, die dem pkg-config-Tool bekannt sind.

PKG_CONFIG_PATHVerwenden Sie diesen Befehl, um den Wert zu überprüfen :

echo $PKG_CONFIG_PATH

Um den PKG_CONFIG_PATHWert einzustellen , verwenden Sie:

export PKG_CONFIG_PATH=/usr/lib/pkgconfig

oder

export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig
devav2
quelle
@ NathanKidd Danke für die Erinnerung, Kommentar gelöscht. Der ursprüngliche Fehler scheint ohnehin auf eine Bearbeitung durch einen nicht ursprünglichen Autor zurückzuführen zu sein.
Timothy Gu
@remram Es sieht so aus, als wären die Fehler behoben, aber Ihr Kommentar lässt die Leute verwirrt, wenn sie den Bearbeitungsverlauf nicht sorgfältig untersuchen. Könnten Sie überprüfen, ob Sie mit der aktuellen Genauigkeit zufrieden sind, und den Kommentar dann löschen? (Und ich werde meine löschen.)
Nathan Kidd
@ devav2 beide Exportbefehle beheben das Problem nicht
Shayan
38

Die erste Antwort ist technisch nicht explizit genug. Auf der Manpage (öffnen Sie ein Terminal, geben Sie Folgendes ein man pkg-config):

pkg-configRuft Informationen zu Paketen aus speziellen Metadatendateien ab. Diese Dateien sind nach dem Paket benannt und haben eine .pcErweiterung. Auf den meisten Systemen pkg-config sieht in /usr/lib/pkgconfig, /usr/share/pkgconfig, /usr/local/lib/pkgconfigund /usr/local/share/pkgconfigfür diese Dateien. Außerdem wird in der durch Doppelpunkte getrennten (unter Windows durch Semikolons getrennten) Liste der Verzeichnisse gesucht, die von der PKG_CONFIG_PATHUmgebungsvariablen angegeben werden.

Das pkg-configProgramm befindet sich also nicht im PKG_CONFIG_PATHVerzeichnis. Wenn Sie jedoch eine Bibliothek installieren, ist bekannt, dass die Informationen, die in einem automakeSkript verwendet werden sollen, in einem Verzeichnis gespeichert sein müssen, damit darauf zugegriffen werden kann pkg-config.

Ian Martin
quelle
Die Schlüsselphrase scheint "auf den meisten Systemen" zu sein. Auf meinem Debian zum Beispiel werden wir /usr/local/lib/x86_64-linux-gnuals automatischer Suchort kostenlos (mit einem leeren PKG_CONFIG_PATH) eingebunden , und in der Tat viele .pcDateien - bemerkenswert, einschließlich GTK + et al. - dort leben. Der Grund dafür ist, die Verfügbarkeit eines Pakets für mehrere Architekturen gleichzeitig zu ermöglichen, wie hier beschrieben: askubuntu.com/questions/449348/…
underscore_d
(kann nicht bearbeiten mehr) @GrandAdmiral in einer Antwort weiter unten auf dieser Seite zeigte , wie die Standardpfade zu überprüfen , die pkg-configauf dem System suchen: askubuntu.com/a/373217/436580
underscore_d
35

Verwenden Sie den folgenden Befehl, um festzustellen, wo pkg-config (Version 0.24 oder höher) standardmäßig nach installierten Bibliotheken sucht:

pkg-config --variable pc_path pkg-config

Um diesen Pfad zu ändern, legen Sie die PKG_CONFIG_PATHUmgebungsvariable fest. Die Man-Datei PKG_CONFIG_PATHlautet:

Eine durch Doppelpunkte getrennte (unter Windows durch Semikolon getrennte) Liste von Verzeichnissen, in denen nach PC-Dateien gesucht werden soll. Nach dem Durchsuchen des Pfads wird immer das Standardverzeichnis durchsucht. Die Standardeinstellung ist libdir / pkgconfig: datadir / pkgconfig, wobei libdir das libdir ist, in dem pkg-config und datadir das datadir ist, in dem pkg-config installiert wurde.

Großadmiral
quelle
3
Ein nützliches Skript istecho $(pkg-config --variable pc_path pkg-config)${PKG_CONFIG_PATH:+:}${PKG_CONFIG_PATH}
albfan
5
Dies ist eine großartige Antwort, die mir geholfen hat. Zur Verdeutlichung sollten Sie jedoch "Zu diesem Pfad hinzufügen" anstelle von "Ändern" sagen, da leere PKG_CONFIG_PATHund immer noch standardmäßig durchsuchte Verzeichnisse vorhanden sein können und das Festlegen eines nicht leeren Werts die Standardwerte nicht löscht.
Underscore_d
Diese Antwort war wirklich nützlich für mich, danke! Ich habe versucht herauszufinden, wie der Standardsuchpfad für pkg-config lautete, da meiner mit Linuxbrew installiert ist, sodass die Standardpfade nicht existieren. Vielen Dank!
mxplusb
6

Sie versuchen, eine Software zu erstellen, sagen wir Widget. Widget stützt sich aus Gründen der Argumentation auf eine andere Bibliothek, libcog. Der Build-Prozess von Widget (wahrscheinlich ein Konfigurationsskript) verwendet pkg-config, um zu bestimmen, wie libcog verwendet wird. pkg-config weiß nichts über libcog.

Wenn libcog nicht installiert ist, ist das Ihr Problem. Es besteht eine gute Chance, dass eine Standardinstallation von libcog das Problem behebt. Abhängig von Ihrem System müssen Sie möglicherweise eine zusätzliche Entwicklerversion des Pakets installieren. Am Ende steht häufig "-devel" oder "-dev". Wenn Sie also "libcog" installieren, müssen Sie möglicherweise auch "libcog-devel" installieren.

Wenn libcog installiert ist, ist es wahrscheinlich nicht so installiert, dass pkg-config es finden kann. Möglicherweise befindet sich irgendwo auf Ihrem System eine libcog.pc-Datei. Aus Gründen der Argumentation finden Sie diese unter /opt/cog/lib/pkgconfig/libcog.pc. In diesem Fall können Sie pkg-config darüber informieren, indem Sie PKG_CONFIG_PATH auf das Verzeichnis setzen, das libcog.pc enthält. Also in einer Bourne-Shell oder ähnlichem sowas

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

Sobald dies erledigt ist, funktioniert es hoffentlich, wenn Sie den fehlgeschlagenen Befehl erneut ausführen.

Wenn libcog installiert ist, einschließlich der Bibliotheken und Header-Dateien, und Sie keine libcog.pc-Datei haben, laufen die Dinge schlecht. Vermutlich enthält eine Standardinstallation von libcog die Informationen, sonst würde Widget sich nicht darauf verlassen. Ich würde zuerst die Neuinstallation von libcog untersuchen. Es ist möglich, die Datei libcog.pc manuell zu erstellen, aber es ist schwierig und sehr spezifisch für eine bestimmte Bibliothek.

Alan De Smet
quelle
4
Eine Sache aber - was ist, wenn PKG_CONFIG_PATH definiert ist - dies wird es korrekt überschreiben?
NoBugs
1
@NoBugs guter Fang, ich habe die Antwort (einige Jahre später!) Bearbeitet, um sie stattdessen anzuhängen.
Joe Malt
5

Ich habe mir die Manpage auf meinem 64-Bit-System angesehen und war etwas verwirrt. In einer Zeile stand:

pkg-config ruft Informationen zu Paketen aus speziellen Metadatendateien ab. Diese Dateien sind nach dem Paket mit der Erweiterung .pc benannt. Standardmäßig sucht pkg-config im Verzeichnispräfix / lib / pkgconfig nach diesen Dateien. Es wird auch in der durch Doppelpunkte getrennten (unter Windows durch Semikolons getrennten) Liste der Verzeichnisse angezeigt, die von der Umgebungsvariablen PKG_CONFIG_PATH angegeben werden.

Ich hatte angenommen, dass es auch in den Verzeichnissen lib / pkgconfig aussieht. Es stellt sich heraus, die Verzeichnisse selbst. In meinem Fall habe ich versucht, das Hello World GTK-Tutorial zu kompilieren. Ich finde die Datei, die ich möchte, z

locate gtk | grep '\.pc'

Unter den Ergebnissen sind:

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

Schließlich sollte ein Export erfolgen.

export PKG_CONFIG_PATH=/usr/lib/x86_64-linux-gnu/pkgconfig/
Opossumkeys
quelle
1
+1, um darauf hinzuweisen, wie maneinfach die Seite für moderne Systeme mit mehreren Architekturen ist. Ich war eine Weile verwirrt, weil ich unter Debian 8 x86 pkg-configbereits im Ordner x86_64 nachgeschaut habe (ohne irgendetwas in PKG_CONFIG_PATH). Ich bin nicht sicher, wie dies aufgenommen wurde, aber die von @GrandAdmiral angezeigte Befehlszeile zeigt an, dass sie durch das --variable pc_path(irgendwie!) Für pkg-configdas eigene Paket festgelegte Steuerelement gesteuert wird .
Underscore_d
5

Mir scheint, dass die meisten Antworten zu viele Informationen enthalten, als dass sie benötigt werden.

Die Software, die installiert wird, ist möglicherweise (und normalerweise) auf einige Bibliotheken und / oder Header angewiesen, und das System verwendet pkg-config, um diese zu finden.

Sucht also pkg-confignach diesen Dateien in vordefinierten (Standard-) Systemverzeichnissen. Diese Ordner sind "Präfix". /usr/localZum Beispiel wird von einer Bibliothek mit Präfix erwartet, dass sie Header enthält /usr/local/include, und die Bibliothek selbst befindet sich in /usr/local/lib. pkg-config sucht jedoch nach Bibliotheken auch in dem Verzeichnis, das in der Umgebungsvariablen PKG_CONFIG_PATH aufgeführt ist .

Wenn Sie dann Software außerhalb der Standardordnerliste installieren, mussten Sie die Liste "anpassen", dh Ihre Verzeichnisse zu PKG_CONFIG_PATH hinzufügen

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

Für weitere Informationen können Sie hier und hier schauen

Clobrano
quelle
PKG_CONFIG_PATHGibt zusätzliche Verzeichnisse an, in denen nur nach yourPkg.pc ( pkg-configSpezifikations-) Dateien gesucht werden soll. Es hat keine Auswirkungen auf pkg-spezifische Dinge wie Bibliotheks-Suchverzeichnisse.
Underscore_d
1

Es bedeutet, dass Sie versuchen, etwas aus dem Quellcode zu erstellen, und nicht alle Abhängigkeiten finden können, die benötigt werden. Das pkg-configSkript, mit dem die Entwicklungsdateien für diese Bibliotheken gefunden werden, gibt diese Meldung aus.

dobey
quelle
0

Ich habe versucht , die neueste Version von installieren axel und ich lief , ./configureund ich habe dies:

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.

Also habe ich versucht:

$ pkg-config --cflags openssl

und ich bekam:

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

Wie offensichtlich, hatte ich openssl installiert ( sudo apt-get install openssl), aber in der obigen Ausgabe steht, wie Sie sehen können, "No package 'openssl' found". Um sicherzugehen, dass ich es getan habe:

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

Es stellte sich heraus, dass ich auf jeden Fall ein anderes Paket brauche, also habe ich ein bisschen gegoogelt und festgestellt, dass ich dieses Paket installieren musste:

sudo apt-get install libssl-dev

Und all dies hatte nichts mit der Änderung der Umgebungsvariablen pkg-config path zu tun.

Shayan
quelle