PKG_CONFIG_PATH Variabile d'ambiente


74

Valuta di modificare la variabile d'ambiente PKG_CONFIG_PATH se hai installato il software in un prefisso non standard. Cosa significa questo ?


1
Lo chiederei quasi allo stesso modo, tranne che avresti potuto chiedere esempi del corretto utilizzo della variabile d'ambiente PKG_CONFIG_PATH come "che cos'è e come si usa?" Sembra che le risposte che hai avuto stessero cercando di dirtelo. Sto trovando questo show molto durante ./configure quando non riesce a trovare le dipendenze.
Douglas G. Allen,

Risposte:


68

PKG_CONFIG_PATHè una variabile di ambiente che specifica percorsi aggiuntivi in ​​cui pkg-configcercare i suoi file .pc.

Questa variabile viene utilizzata per aumentare il percorso di ricerca predefinito di pkg-config. Su un tipico sistema Unix, cercherà nelle directory /usr/lib/pkgconfige /usr/share/pkgconfig. Questo di solito coprirà i moduli installati dal sistema. Tuttavia, alcuni moduli locali possono essere installati in un prefisso diverso come /usr/local. In tal caso, è necessario anteporre il percorso di ricerca in modo che pkg-config possa individuare i file .pc.

Il pkg-configprogramma viene utilizzato per recuperare informazioni sulle librerie installate nel sistema. L'uso primario di pkg-configè fornire i dettagli necessari per la compilazione e il collegamento di un programma a una libreria. Questi metadati sono archiviati in file pkg-config. Questi file hanno il suffisso .pc e risiedono in posizioni specifiche note allo strumento pkg-config.

Per verificare il PKG_CONFIG_PATHvalore utilizzare questo comando:

echo $PKG_CONFIG_PATH

Per impostare il PKG_CONFIG_PATHvalore utilizzare:

export PKG_CONFIG_PATH=/usr/lib/pkgconfig

o

export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig

@NathanKidd Grazie per il promemoria, commento eliminato. L'errore originale sembra essere stato comunque causato da una modifica non originale dell'autore.
Timothy Gu,

@remram sembra che gli errori siano stati corretti ora, ma il tuo commento lascia le persone confuse se non esaminano attentamente la cronologia delle modifiche. Potresti verificare di essere soddisfatto dell'accuratezza attuale e forse eliminare il commento allora? (E cancellerò il mio.)
Nathan Kidd il

@ devav2 entrambi i comandi di esportazione non risolvono il problema
Shayan,

38

La prima risposta non è tecnicamente abbastanza esplicita. Dalla pagina man (aprire un terminale, digitare man pkg-config):

pkg-configrecupera informazioni sui pacchetti da file di metadati speciali. Questi file prendono il nome dal pacchetto e hanno .pcun'estensione. Sulla maggior parte dei sistemi, pkg-config guarda in /usr/lib/pkgconfig, /usr/share/pkgconfig, /usr/local/lib/pkgconfige /usr/local/share/pkgconfigper questi file. Verrà inoltre visualizzato nell'elenco di directory separato da due punti (su Windows, separato da punto e virgola) specificato dalla PKG_CONFIG_PATHvariabile di ambiente.

Quindi il pkg-configprogramma non è nella PKG_CONFIG_PATHdirectory; tuttavia, se si installa una libreria, affinché le informazioni per utilizzarlo in uno automakescript siano accessibili, è necessario che siano presenti in una directory pkg-config.


La frase chiave sembra essere "sulla maggior parte dei sistemi". Sul mio Debian, ad esempio, veniamo /usr/local/lib/x86_64-linux-gnuinseriti come una posizione di ricerca automatica gratuitamente (con uno spazio vuoto PKG_CONFIG_PATH) e, in effetti, molti .pcfile, tra cui GTK + et al. - vivi lì. Il motivo di ciò è abilitare la disponibilità multi-architettura di un pacchetto contemporaneamente, come indicato qui: askubuntu.com/questions/449348/…
underscore_d

(non è più possibile modificarlo) @GrandAdmiral in una risposta più in basso in questa pagina ha mostrato come controllare i percorsi predefiniti che pkg-configcercheranno sul tuo sistema: askubuntu.com/a/373217/436580
underscore_d

35

Per vedere dove pkg-config (versione 0.24 o successive) cerca le librerie installate per impostazione predefinita, usare il comando seguente:

pkg-config --variable pc_path pkg-config

Per modificare quel percorso, impostare la PKG_CONFIG_PATHvariabile di ambiente. Gli stati del file man PKG_CONFIG_PATHsono:

Un elenco di directory separate da due punti (su Windows, separate da punto e virgola) per cercare i file .pc. La directory predefinita verrà sempre cercata dopo aver cercato il percorso; il valore predefinito è libdir / pkgconfig: datadir / pkgconfig dove libdir è il libdir dove pkg-config e datadir è il datadir in cui è stato installato pkg-config.


3
uno script utile saràecho $(pkg-config --variable pc_path pkg-config)${PKG_CONFIG_PATH:+:}${PKG_CONFIG_PATH}
albfan

5
Questa è un'ottima risposta che mi ha aiutato. Tuttavia, per chiarire, dovresti dire "Per aggiungere a quel percorso", piuttosto che "Per modificare", poiché si può avere uno spazio vuoto PKG_CONFIG_PATHe avere ancora directory ricercate predefinite, inoltre l'impostazione di un valore non vuoto non cancella i valori predefiniti.
underscore_d,

Questa risposta mi è stata davvero utile, grazie! Stavo cercando di capire quale fosse il percorso di ricerca predefinito per pkg-config poiché il mio è installato con Linuxbrew, quindi i percorsi predefiniti non esistono. Grazie!
mxplusb,

6

Stai cercando di creare un software, diciamo Widget. Il widget si basa su un'altra libreria, libcog per motivi di discussione. Il processo di generazione del widget (probabilmente uno script di configurazione) sta usando pkg-config per determinare come usare libcog. pkg-config non sa nulla di libcog.

Se libcog non è installato, questo è il tuo problema. C'è una buona probabilità che un'installazione standard di libcog risolva il problema. A seconda del sistema in uso, potrebbe essere necessario installare una versione aggiuntiva "sviluppatore" del pacchetto; spesso ha "-devel" o "-dev" alla fine, quindi se si installa "libcog", potrebbe essere necessario installare "libcog-devel".

Se è installato libcog, probabilmente non è installato in modo tale che pkg-config possa trovarlo. Probabilmente c'è un file libcog.pc da qualche parte sul tuo sistema. Per ragioni di argomento, è su /opt/cog/lib/pkgconfig/libcog.pc. In tal caso, puoi dirlo a pkg-config impostando PKG_CONFIG_PATH sulla directory che contiene libcog.pc. Quindi in una shell Bourne o simile, qualcosa del genere

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

Una volta fatto, rieseguendo il comando che fallisce, si spera che funzioni.

Se è installato libcog, incluse le librerie e i file di intestazione, e non hai un file libcog.pc, le cose stanno andando male. Presumibilmente un'installazione standard di libcog include le informazioni, altrimenti Widget non farebbe affidamento su di esse. Innanzitutto esaminerei la reinstallazione di libcog. È possibile creare manualmente il file libcog.pc, ma farlo correttamente è difficile e altamente specifico per una determinata libreria.


4
Una cosa però - cosa succede se PKG_CONFIG_PATH è definito - questo lo sovrascriverà correttamente?
NoBugs,

1
@NoBugs buona cattura, ho modificato la risposta (diversi anni dopo!) Per aggiungerla invece.
Joe Malt,

5

Ho guardato la pagina man sul mio sistema a 64 bit e mi sono un po 'confuso. Diceva in una riga:

pkg-config recupera le informazioni sui pacchetti da speciali file di metadati. Questi file prendono il nome dal pacchetto, con l'estensione .pc. Di default, pkg-config cerca nel prefisso di directory / lib / pkgconfig questi file; cercherà anche nell'elenco di directory separate da due punti (su Windows, punto e virgola) specificate dalla variabile di ambiente PKG_CONFIG_PATH.

Avevo supposto che stesse sempre nelle directory lib / pkgconfig. Si scopre che sono le directory stesse. Nel mio caso, stavo cercando di compilare il tutorial ciao mondo gtk. Individuo il file che voglio ad es

locate gtk | grep '\.pc'

Tra i risultati ci sono:

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

Alla fine doveva fare un'esportazione.

export PKG_CONFIG_PATH=/usr/lib/x86_64-linux-gnu/pkgconfig/

1
+1 per indicare come la manpagina si sta semplificando eccessivamente per i sistemi moderni e multi-architettura. Sono stato confuso per un po 'perché, su Debian 8 x86, pkg-configguarda già nella cartella x86_64 (senza nulla dentro PKG_CONFIG_PATH). Non sono sicuro di come sia stato incorporato, ma la riga di comando per sondare ciò mostrato da @GrandAdmiral indica che è controllato da --variable pc_pathquello impostato (in qualche modo!) Per pkg-configil proprio pacchetto.
underscore_d,

5

Mi sembra che la maggior parte delle risposte contenga troppe informazioni del necessario.

Il software che si installa può (e di solito lo fa) fare affidamento su alcune librerie e / o intestazioni e il Sistema utilizza pkg-config per trovarle.

Detto questo, pkg-configcerca questi file nelle directory di sistema predefinite (predefinite). Quelle cartelle sono "prefisso". Ad esempio, una libreria con prefisso /usr/localdovrebbe contenere intestazioni /usr/local/includee la libreria stessa verrà inserita /usr/local/lib. pkg-config cerca comunque le librerie anche nella directory elencata nella variabile d'ambiente PKG_CONFIG_PATH .

Quindi, se installi software al di fuori dell'elenco predefinito di cartelle, devi "regolare" l'elenco, vale a dire aggiungere le tue directory a PKG_CONFIG_PATH

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

Per maggiori informazioni, puoi guardare qui e qui


PKG_CONFIG_PATHspecifica ulteriori directory in cui cercare solo i file yourPkg.pc(di pkg-configspecifica). Non influisce su cose specifiche di pkg come le directory di ricerca delle biblioteche.
underscore_d,

1

Significa che stai cercando di costruire qualcosa dalla fonte e non riesce a trovare tutte le dipendenze di cui ha bisogno. Lo pkg-configscript che utilizza per trovare i file di sviluppo per quelle librerie, genera questo messaggio.


0

Stavo cercando di installare l'ultima versione di axel e ho corso ./configuree ho ottenuto questo:

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.

Quindi ho provato:

$ pkg-config --cflags openssl

e ho ottenuto:

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

Come ovvio avevo installato openssl ( sudo apt-get install openssl) Ma sull'output sopra come puoi vedere dice "Nessun pacchetto 'openssl' trovato". Quindi, per essere sicuro di averlo fatto:

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

Risulta che ho sicuramente bisogno di qualche altro pacchetto, quindi un po 'googling e ho scoperto che dovevo installare questo pacchetto:

sudo apt-get install libssl-dev

E tutto ciò non ha nulla a che fare con la modifica della variabile env del percorso pkg-config.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.