Variável de ambiente PKG_CONFIG_PATH


74

Considere ajustar a variável de ambiente PKG_CONFIG_PATH se você instalou o software em um prefixo não padrão. O que isto significa ?


11
Eu quase perguntaria isso da mesma maneira, exceto que você poderia ter pedido exemplos do uso adequado da variável de ambiente PKG_CONFIG_PATH como "o que é e como usá-lo?" Parece que as respostas que você recebeu estavam tentando lhe dizer isso. Estou achando isso muito aparente durante ./configure quando ele falha ao encontrar dependências.
Douglas G. Allen

Respostas:


68

PKG_CONFIG_PATHé uma variável de ambiente que especifica caminhos adicionais nos quais pkg-configos arquivos .pc serão pesquisados.

Essa variável é usada para aumentar o caminho de pesquisa padrão do pkg-config. Em um sistema Unix típico, ele procurará nos diretórios /usr/lib/pkgconfige /usr/share/pkgconfig. Isso geralmente abrange os módulos instalados no sistema. No entanto, alguns módulos locais podem ser instalados em um prefixo diferente, como /usr/local. Nesse caso, é necessário preceder o caminho de pesquisa para que o pkg-config possa localizar os arquivos .pc.

O pkg-configprograma é usado para recuperar informações sobre bibliotecas instaladas no sistema. O principal uso de pkg-configé fornecer os detalhes necessários para compilar e vincular um programa a uma biblioteca. Esses metadados são armazenados nos arquivos pkg-config. Esses arquivos possuem o sufixo .pc e residem em locais específicos conhecidos pela ferramenta pkg-config.

Para verificar o PKG_CONFIG_PATHvalor, use este comando:

echo $PKG_CONFIG_PATH

Para definir o PKG_CONFIG_PATHvalor, use:

export PKG_CONFIG_PATH=/usr/lib/pkgconfig

ou

export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig

@NathanKidd Obrigado pelo lembrete, comentário excluído. O erro original parece ter sido resultado de uma edição de autor não original de qualquer maneira.
Timothy Gu

@remram, parece que os erros foram corrigidos agora, mas seu comentário deixa as pessoas confusas se não examinarem cuidadosamente o histórico de edições. Você pode verificar se está satisfeito com a precisão atual e talvez excluir o comentário? (E eu vou apagar minha.)
Nathan Kidd

@ comandos devav2 tanto de exportação não corrigir o problema
Shayan

38

A primeira resposta não é tecnicamente explícita o suficiente. Na página do manual (abra um terminal, digite man pkg-config):

pkg-configrecupera informações sobre pacotes de arquivos de metadados especiais. Esses arquivos são nomeados após o pacote e têm uma .pcextensão. Na maioria dos sistemas, pkg-config olha em /usr/lib/pkgconfig, /usr/share/pkgconfig, /usr/local/lib/pkgconfige /usr/local/share/pkgconfigpara esses arquivos. Além disso, ele procurará na lista de diretórios separados por dois pontos (no Windows, separados por ponto e vírgula) especificados pela PKG_CONFIG_PATHvariável de ambiente.

Portanto, o pkg-configprograma não está no PKG_CONFIG_PATHdiretório; no entanto, se você instalar uma biblioteca, as informações para usá-las em um automakescript sejam acessíveis e precisam estar em um diretório pkg-config.


A frase-chave parece estar "na maioria dos sistemas". No meu Debian, por exemplo, somos /usr/local/lib/x86_64-linux-gnulançados como um local de pesquisa automática de graça (com um vazio PKG_CONFIG_PATH) e, de fato, muitos .pcarquivos - notáveis, incluindo GTK + et al. - mora lá. A razão para isso é habilitar a disponibilidade de várias arquiteturas de um pacote simultaneamente, conforme descrito aqui: askubuntu.com/questions/449348/…
underscore_d

(não é possível editar mais) @GrandAdmiral em uma resposta mais abaixo nesta página mostrou como verificar os caminhos padrão que pkg-configserão pesquisados ​​no seu sistema: askubuntu.com/a/373217/436580
underscore_d

35

Para ver onde o pkg-config (versão 0.24 ou posterior) procura bibliotecas instaladas por padrão, use o seguinte comando:

pkg-config --variable pc_path pkg-config

Para modificar esse caminho, defina a PKG_CONFIG_PATHvariável de ambiente. Os estados do arquivo man PKG_CONFIG_PATHsão:

Uma lista de diretórios separados por dois pontos (no Windows, separados por ponto e vírgula) para procurar arquivos .pc. O diretório padrão será sempre pesquisado depois de pesquisar o caminho; o padrão é libdir / pkgconfig: datadir / pkgconfig em que libdir é o libdir em que pkg-config e datadir é o datadir em que o pkg-config foi instalado.


3
um script útil seráecho $(pkg-config --variable pc_path pkg-config)${PKG_CONFIG_PATH:+:}${PKG_CONFIG_PATH}
albfan

5
Esta é uma ótima resposta que me ajudou. No entanto, para esclarecer, você deve dizer "Para adicionar a esse caminho", em vez de "Para modificar", pois é possível ter um PKG_CONFIG_PATHdiretório em branco e ainda ter diretórios pesquisados ​​padrão, além de definir um valor não em branco não limpa os padrões.
underscore_d

Esta resposta foi realmente útil para mim, obrigado! Eu estava tentando descobrir qual era o caminho de pesquisa padrão para o pkg-config desde que o meu é instalado com o Linuxbrew, para que os caminhos padrão não existam. Obrigado!
Mxplusb

6

Você está tentando criar um software, digamos, Widget. O widget depende de outra biblioteca, libcog por razões de argumento. O processo de construção do widget (provavelmente um script de configuração) está usando o pkg-config para determinar como usar a libcog. O pkg-config não sabe nada sobre libcog.

Se a libcog não estiver instalada, esse é o seu problema. Há uma boa chance de que uma instalação padrão do libcog resolva o problema. Dependendo do seu sistema, pode ser necessário instalar uma versão "desenvolvedor" adicional do pacote; ele geralmente possui "-devel" ou "-dev" no final; portanto, se você instalar o "libcog", poderá também precisar instalar o "libcog-devel".

Se o libcog estiver instalado, provavelmente não está instalado de forma que o pkg-config possa encontrá-lo. Provavelmente existe um arquivo libcog.pc em algum lugar do seu sistema. Por uma questão de argumento, está em /opt/cog/lib/pkgconfig/libcog.pc. Nesse caso, você pode contar ao pkg-config sobre isso configurando PKG_CONFIG_PATH no diretório que contém libcog.pc. Então, em uma concha Bourne ou similar, algo como

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

Feito isso, executar novamente o comando que falhou funcionará.

Se o libcog estiver instalado, incluindo as bibliotecas e os arquivos de cabeçalho, e você não tiver um arquivo libcog.pc, as coisas estão indo mal. Presumivelmente, uma instalação padrão do libcog inclui as informações, caso contrário, o Widget não confiaria nela. Eu primeiro investigaria a reinstalação do libcog. É possível criar manualmente o arquivo libcog.pc, mas acertar é difícil e altamente específico para uma determinada biblioteca.


4
Porém, uma coisa - e se PKG_CONFIG_PATH for definido - isso substituirá o correto?
NoBugs

11
@ NoBugs boa captura, editei a resposta (vários anos depois!) Para anexá-la.
Joe Malt

5

Eu olhei para a página de manual no meu sistema de 64 bits e fiquei um pouco confuso. Dizia em uma linha:

O pkg-config recupera informações sobre pacotes de arquivos de metadados especiais. Esses arquivos são nomeados após o pacote, com a extensão .pc. Por padrão, o pkg-config procura no prefixo do diretório / lib / pkgconfig esses arquivos; ele também procurará na lista de diretórios separados por dois pontos (no Windows, separados por ponto e vírgula) especificados pela variável de ambiente PKG_CONFIG_PATH.

Eu assumi que ele já estava nos diretórios lib / pkgconfig. Acontece que são os próprios diretórios. No meu caso, estava tentando compilar o tutorial hello world gtk. Eu localizo o arquivo que eu quero, por exemplo

locate gtk | grep '\.pc'

Entre os resultados estão:

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

Finalmente foi fazer uma exportação.

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

11
+1 para apontar como a manpágina é simplificadora demais para sistemas modernos com capacidade para várias arquiteturas. Fiquei confuso por um tempo porque, no Debian 8 x86, pkg-configjá aparece na pasta x86_64 (sem nada PKG_CONFIG_PATH). Não tenho certeza de como isso foi incorporado, mas a linha de comando para investigar isso mostrado pelo @GrandAdmiral indica que é controlado pelo --variable pc_pathque está definido (de alguma forma!) Para pkg-configo próprio pacote.
underscore_d

5

Parece-me que a maioria das respostas tem muita informação do que o necessário.

O software que se instala pode (e geralmente depende) de algumas bibliotecas e / ou cabeçalhos e o Sistema usa o pkg-config para encontrá-los.

Dito isso, pkg-configprocura esses arquivos nos diretórios do sistema predefinidos (padrão). Essas pastas são "prefixo". Por exemplo, uma biblioteca que tem prefixo /usr/localdeverá ter cabeçalhos /usr/local/include, e a própria biblioteca estará em /usr/local/lib. O pkg-config, no entanto, procura bibliotecas também no diretório listado na variável de ambiente PKG_CONFIG_PATH .

Então, se você instalar um software fora da lista padrão de pastas, terá que "ajustar" a lista, incluindo seus diretórios em PKG_CONFIG_PATH

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

Para mais informações, você pode procurar aqui e aqui


PKG_CONFIG_PATHespecifica diretórios adicionais nos quais procurar apenas arquivos yourPkg.pc( pkg-configespecificação). Não afeta itens específicos do pacote, como diretórios de pesquisa de bibliotecas.
underscore_d

1

Isso significa que você está tentando criar algo a partir da fonte e não consegue encontrar todas as dependências necessárias. O pkg-configscript usado para encontrar os arquivos de desenvolvimento para essas bibliotecas gera essa mensagem.


0

Eu estava tentando instalar a versão mais recente do axel e executei ./configuree obtive o seguinte:

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.

Então eu tentei:

$ pkg-config --cflags openssl

e eu tenho:

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

Tão óbvio que eu tinha o openssl instalado ( sudo apt-get install openssl) Mas, na saída acima, como você pode ver, ele declara "Nenhum pacote 'openssl' encontrado". Então, para ter certeza que sim:

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

Acontece que eu preciso de algum outro pacote, com certeza, então um pouco pesquisando e descobri que tinha que instalar este pacote:

sudo apt-get install libssl-dev

E tudo isso não tinha nada a ver com a alteração da variável env do caminho do pkg-config.


Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.