PKG_CONFIG_PATH variable de entorno


74

Considere ajustar la variable de entorno PKG_CONFIG_PATH si instaló software en un prefijo no estándar. Qué significa esto ?


1
Casi preguntaría esto de la misma manera, excepto que podría haber pedido ejemplos del uso adecuado de la variable de entorno PKG_CONFIG_PATH como "¿qué es y cómo lo uso?" Parece que las respuestas que obtuviste intentaban decirte esto. Encuentro que esto aparece mucho durante ./configure cuando no puede encontrar dependencias.
Douglas G. Allen

Respuestas:


68

PKG_CONFIG_PATHes una variable de entorno que especifica rutas adicionales en las que pkg-configbuscará sus archivos .pc.

Esta variable se utiliza para aumentar la ruta de búsqueda predeterminada de pkg-config. En un sistema Unix típico, buscará en los directorios /usr/lib/pkgconfigy /usr/share/pkgconfig. Esto generalmente cubrirá los módulos instalados en el sistema. Sin embargo, algunos módulos locales pueden instalarse en un prefijo diferente como /usr/local. En ese caso, es necesario anteponer la ruta de búsqueda para que pkg-config pueda localizar los archivos .pc.

El pkg-configprograma se utiliza para recuperar información sobre bibliotecas instaladas en el sistema. El uso principal de pkg-configes proporcionar los detalles necesarios para compilar y vincular un programa a una biblioteca. Estos metadatos se almacenan en archivos pkg-config. Estos archivos tienen el sufijo .pc y residen en ubicaciones específicas conocidas por la herramienta pkg-config.

Para verificar el PKG_CONFIG_PATHvalor use este comando:

echo $PKG_CONFIG_PATH

Para establecer el PKG_CONFIG_PATHvalor use:

export PKG_CONFIG_PATH=/usr/lib/pkgconfig

o

export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig

@NathanKidd Gracias por el recordatorio, comentario eliminado. El error original parece haber sido resultado de una edición de autor no original de todos modos.
Timothy Gu

@remram parece que los errores se han solucionado ahora, pero su comentario deja a las personas confundidas si no examinan cuidadosamente el historial de edición. ¿Podrías comprobar que estás contento con la precisión actual y quizás eliminar el comentario entonces? (Y borraré la mía.)
Nathan Kidd

@ devav2 ambos comandos de exportación no solucionan el problema
Shayan

38

La primera respuesta no es técnicamente lo suficientemente explícita. Desde la página del manual (abra una terminal, escriba man pkg-config):

pkg-configrecupera información sobre paquetes de archivos especiales de metadatos. Estos archivos llevan el nombre del paquete y tienen una .pcextensión. En la mayoría de los sistemas, pkg-config se ve en /usr/lib/pkgconfig, /usr/share/pkgconfig, /usr/local/lib/pkgconfigy /usr/local/share/pkgconfigpara estos archivos. Además, buscará en la lista de directorios separados por dos puntos (en Windows, separados por punto y coma) especificados por la PKG_CONFIG_PATHvariable de entorno.

Entonces el pkg-configprograma no está en el PKG_CONFIG_PATHdirectorio; sin embargo, si instala una biblioteca, para que la información para usarla en un automakescript sea accesible, debe estar en un directorio que pkg-configtenga en cuenta.


La frase clave parece ser "en la mayoría de los sistemas". En mi Debian, por ejemplo, nos /usr/local/lib/x86_64-linux-gnulanzan como una ubicación de búsqueda automática de forma gratuita (con un vacío PKG_CONFIG_PATH) y, de hecho, muchos .pcarchivos, notables, incluidos GTK + et al. - vivir allí. La razón de esto es permitir la disponibilidad de múltiples arquitecturas de un paquete simultáneamente, como se describe aquí: askubuntu.com/questions/449348/…
underscore_d

(no puede editar más) @GrandAdmiral en una respuesta más abajo en esta página mostró cómo verificar las rutas predeterminadas que pkg-configbuscarán en su sistema: askubuntu.com/a/373217/436580
underscore_d

35

Para ver dónde pkg-config (versión 0.24 o posterior) busca las bibliotecas instaladas de forma predeterminada, use el siguiente comando:

pkg-config --variable pc_path pkg-config

Para modificar esa ruta, establezca la PKG_CONFIG_PATHvariable de entorno. El archivo man indica PKG_CONFIG_PATH:

Una lista de directorios separados por dos puntos (en Windows, separados por punto y coma) para buscar archivos .pc. El directorio predeterminado siempre se buscará después de buscar la ruta; el valor predeterminado es libdir / pkgconfig: datadir / pkgconfig donde libdir es el libdir donde pkg-config y datadir es el datadir donde se instaló pkg-config.


3
un guión útil seráecho $(pkg-config --variable pc_path pkg-config)${PKG_CONFIG_PATH:+:}${PKG_CONFIG_PATH}
albfan

55
Esta es una gran respuesta que me ayudó. Sin embargo, para aclarar, debe decir "Para agregar a esa ruta", en lugar de "Para modificar", ya que uno puede tener un espacio en blanco PKG_CONFIG_PATHy aún tener directorios de búsqueda predeterminados, además de establecer un valor no en blanco no borra los valores predeterminados.
underscore_d

Esta respuesta fue realmente útil para mí, ¡gracias! Estaba tratando de averiguar cuál era la ruta de búsqueda predeterminada para pkg-config ya que la mía está instalada con Linuxbrew, por lo que las rutas predeterminadas no existen. ¡Gracias!
mxplusb

6

Estás tratando de construir una pieza de software, digamos Widget. Widget se basa en otra biblioteca, libcog en aras de la discusión. El proceso de compilación del widget (probablemente un script de configuración) está usando pkg-config para determinar cómo usar libcog. pkg-config no sabe nada sobre libcog.

Si libcog no está instalado, ese es tu problema. Existe una buena posibilidad de que una instalación estándar de libcog solucione el problema. Dependiendo de su sistema, es posible que necesite instalar una versión adicional de "desarrollador" del paquete; a menudo tiene "-devel" o "-dev" al final, por lo que si instala "libcog", es posible que también necesite instalar "libcog-devel".

Si libcog está instalado, probablemente no esté instalado de manera que pkg-config pueda encontrarlo. Probablemente haya un archivo libcog.pc en algún lugar de su sistema. En aras de la discusión, está en /opt/cog/lib/pkgconfig/libcog.pc. En ese caso, puede informarle a pkg-config al configurar PKG_CONFIG_PATH en el directorio que contiene libcog.pc. Entonces, en un shell Bourne o similar, algo así como

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

Una vez hecho esto, volver a ejecutar el comando que falló con suerte funcionará.

Si está instalado libcog, incluidas las bibliotecas y los archivos de encabezado, y no tiene un archivo libcog.pc, las cosas van mal. Presumiblemente, una instalación estándar de libcog incluye la información, de lo contrario, Widget no confiaría en ella. Primero investigaría reinstalar libcog. Es posible crear manualmente el archivo libcog.pc, pero hacerlo bien es difícil y altamente específico para una biblioteca determinada.


44
Sin embargo, una cosa: ¿qué pasa si se define PKG_CONFIG_PATH? ¿Esto lo sobrescribirá correctamente?
NoBugs

1
@NoBugs buena captura, he editado la respuesta (¡varios años después!) Para agregarla en su lugar.
Joe Malt

5

Miré la página de manual de mi sistema de 64 bits y me confundí un poco. Decía en una línea:

pkg-config recupera información sobre paquetes de archivos especiales de metadatos. Estos archivos llevan el nombre del paquete, con la extensión .pc. Por defecto, pkg-config busca en el prefijo de directorio / lib / pkgconfig estos archivos; también buscará en la lista de directorios separados por dos puntos (en Windows, separados por punto y coma) especificados por la variable de entorno PKG_CONFIG_PATH.

Supuse que siempre se ve en los directorios lib / pkgconfig. Resulta que son los directorios mismos. En mi caso, estaba tratando de compilar el tutorial hello world gtk. Localizo el archivo que quiero, por ejemplo

locate gtk | grep '\.pc'

Entre los resultados están:

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

Finalmente fue para hacer una exportación.

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

1
+1 para señalar cómo la manpágina se simplifica demasiado para los sistemas modernos con capacidad de arquitectura múltiple. Estuve confundido por un tiempo porque, en Debian 8 x86, pkg-configya se ve en la carpeta x86_64 (sin nada PKG_CONFIG_PATH). No estoy seguro de cómo se incorporó esto, pero la línea de comando para probar esto que muestra @GrandAdmiral indica que está controlado por el --variable pc_pathque está configurado (¡de alguna manera!) Para pkg-configel propio paquete.
underscore_d

5

Me parece que la mayoría de las respuestas tienen demasiada información de la necesaria.

El software que se instala puede (y generalmente lo hace) depender de algunas bibliotecas y / o encabezados y el Sistema usa pkg-config para encontrarlos.

Dicho esto, pkg-configbusca estos archivos en los directorios del sistema predefinidos (predeterminados). Esas carpetas son "prefijo". Por ejemplo, /usr/localse espera que una biblioteca que tenga prefijo tenga encabezados /usr/local/include, y la biblioteca en sí estará /usr/local/lib. Sin embargo, pkg-config busca bibliotecas también en el directorio listado en la variable de entorno PKG_CONFIG_PATH .

Luego, si instala software fuera de la lista predeterminada de carpetas, debe "ajustar" la lista, es decir, agregar sus directorios a PKG_CONFIG_PATH

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

Para más información, puedes mirar aquí y aquí


PKG_CONFIG_PATHespecifica directorios adicionales en los que buscar solo archivos yourPkg.pc( pkg-configespecificación). No afecta a cosas específicas de pkg como directorios de búsqueda de biblioteca.
underscore_d

1

Significa que está tratando de construir algo desde la fuente, y no puede encontrar todas las dependencias que necesita. El pkg-configscript que utiliza para encontrar los archivos de desarrollo para esas bibliotecas, genera este mensaje.


0

Estaba tratando de instalar la última versión de axel y corrí ./configurey obtuve esto:

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.

Entonces intenté:

$ pkg-config --cflags openssl

y obtuve:

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

Como es obvio, tenía openssl instalado ( sudo apt-get install openssl) Pero en el resultado anterior, como puede ver, dice "No se encontró el paquete 'openssl'". Entonces, para asegurarme de que lo hice:

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

Resulta que necesito otro paquete seguro, así que busqué un poco en Google y descubrí que tenía que instalar este paquete:

sudo apt-get install libssl-dev

Y todo esto no tuvo nada que ver con el cambio de la variable env de la ruta pkg-config.


Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.