LD_LIBRARY_PATH vs LIBRARY_PATH

159

Estou criando um programa C ++ simples e quero substituir temporariamente uma biblioteca compartilhada fornecida pelo sistema por uma versão mais recente, para desenvolvimento e teste.

Tentei definir a variável LD_LIBRARY_PATH, mas o vinculador (ld) falhou com:

/ usr / bin / ld: não é possível encontrar -lyaml-cpp

Eu esperava que funcionasse porque, de acordo com a página de manual do ld:

O vinculador usa os seguintes caminhos de pesquisa para localizar as bibliotecas compartilhadas necessárias: ... Para um vinculador nativo, o conteúdo da variável de ambiente "LD_LIBRARY_PATH" ...

Eu tentei configurar o LIBRARY_PATH e funcionou.

De acordo com o manual do GCC:

O valor de LIBRARY_PATH é uma lista de diretórios separados por dois pontos, bem como PATH. Quando configurado como um compilador nativo, o GCC tenta os diretórios assim especificados ao procurar arquivos vinculados especiais, se não conseguir encontrá-los usando o GCC_EXEC_PREFIX. A vinculação usando o GCC também usa esses diretórios ao procurar bibliotecas comuns para a opção -l (mas os diretórios especificados com -L são os primeiros).

Como o manual (GCC) sugere, LIBRARY_PATH funciona porque eu vinculo ao GCC.

Mas..

  • Desde que eu vinculo ao gcc, por que ld está sendo chamado, como sugere a mensagem de erro?
  • Qual é o sentido de ter duas variáveis ​​que servem ao mesmo propósito? Há outras diferenças lá?
Georgios Politis
fonte

Respostas:

213

LIBRARY_PATH é usado pelo gcc antes da compilação para pesquisar diretórios contendo bibliotecas estáticas e compartilhadas que precisam ser vinculadas ao seu programa.

LD_LIBRARY_PATHé usado pelo seu programa para procurar diretórios que contêm bibliotecas compartilhadas após a compilação e o link com êxito.

EDIT: Como indicado abaixo, suas bibliotecas podem ser estáticas ou compartilhadas. Se for estático, o código será copiado para o seu programa e você não precisará procurar a biblioteca depois que o programa for compilado e vinculado. Se sua biblioteca é compartilhada, ela precisa ser vinculada dinamicamente ao seu programa e é aí que LD_LIBRARY_PATHentra em cena.

Naveen
fonte
14
E, claro LD_LIBRARY_PATH só faz sentido com bibliotecas dinâmicas
Alex Jasmin
2
Meu argumento é que, se eu usasse ld para vincular (diretamente), então, de acordo com o manual ld, LD_LIBRARY_PATH teria sido usado para procurar diretórios contendo as bibliotecas que precisam ser vinculadas ao meu programa. Eu devo estar faltando alguma coisa aqui .. #
Georgios Politis
2
a menos que você invoque o ld e combine os arquivos de objeto com as bibliotecas, ele 'herdará' o caminho que o gcc passa para ele. Você pode substituir o gcc padrão, com as opções -Xlinker.
Naveen
5
Na verdade, LIBRARY_PATH é usado para pesquisar diretórios que contêm bibliotecas estáticas AND dinâmicas, em vez de apenas bibliotecas estáticas.
particle128
3
Sim, isso está errado - a diferença é que LIBRARY_PATHsão pesquisadas bibliotecas (estáticas ou dinâmicas) em tempo de compilação e LD_LIBRARY_PATHsão pesquisadas bibliotecas dinâmicas em tempo de execução. Obviamente, em tempo de execução, você não precisa procurar bibliotecas estáticas.
Timmmm 01/02/19
47

LD_LIBRARY_PATHé pesquisado quando o programa inicia, LIBRARY_PATHé pesquisado no momento do link.

ressalva de comentários :

F'x
fonte
38
Nota: ao vincular bibliotecas, ldpor si só não procura bibliotecas em um LIBRARY_PATHou em LD_LIBRARY_PATH. É somente quando gccinvoca ldque LIBRARY_PATHé usado. (Aprendi isso da maneira mais difícil.)
Rufflewind
1
@Rufflewind Interessante, mas teria sido ainda mais se você tivesse dado alguma referência.
hmijail lamenta os demitidos 15/02
Essa visualização faz uma distinção no momento em que as bibliotecas são pesquisadas (tempo de link versus tempo de execução) enquanto @Naveen faz uma distinção do tipo de bibliotecas que são pesquisadas (estática v dinâmica). Existem duas visualizações efetivamente idênticas (dinâmico: tempo de execução = estático: tempo do link) ou há situações importantes em que essa correspondência não é válida? Eu acho que é necessário algum conhecimento sobre as bibliotecas dinâmicas também em tempo de compilação.
XavierStuvw
13

Desde que eu vinculo ao gcc, por que ld está sendo chamado, como sugere a mensagem de erro?

O gcc chama ld internamente quando está no modo de vinculação.

heroxbd
fonte