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á?
LIBRARY_PATH
é usado para pesquisar diretórios que contêm bibliotecas estáticas AND dinâmicas, em vez de apenas bibliotecas estáticas.LIBRARY_PATH
são pesquisadas bibliotecas (estáticas ou dinâmicas) em tempo de compilação eLD_LIBRARY_PATH
são pesquisadas bibliotecas dinâmicas em tempo de execução. Obviamente, em tempo de execução, você não precisa procurar bibliotecas estáticas.LD_LIBRARY_PATH
é pesquisado quando o programa inicia,LIBRARY_PATH
é pesquisado no momento do link.ressalva de comentários :
ld
(em vez degcc
oug++
), as variáveis de ambienteLIBRARY_PATH
ouLD_LIBRARY_PATH
não são lidas.gcc
oug++
, aLIBRARY_PATH
variável de ambiente é lida (consulte a documentação "gcc
usa esses diretórios ao procurar bibliotecas comuns" ).fonte
ld
por si só não procura bibliotecas em umLIBRARY_PATH
ou emLD_LIBRARY_PATH
. É somente quandogcc
invocald
queLIBRARY_PATH
é usado. (Aprendi isso da maneira mais difícil.)O gcc chama ld internamente quando está no modo de vinculação.
fonte