onde está LD_LIBRARY_PATH? como faço para definir a variável env LD_LIBRARY_PATH?

26

Eu estou tentando criar um programa c ++ usando o Unix.

Eu entendi o erro

Linking CXX executable ../../bin/ME
/usr/bin/ld: cannot find -lboost_regex-mt

Ouvi dizer que só preciso definir o local do libboost * na minha variável LD_LIBRARY_PATH env e depois invocar o make como originalmente, digitando

-L /usr/lib64 -l boost_regex-mt

ou

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/lib64

Mas onde está LD_LIBRARY_PATH? como faço para definir a variável env LD_LIBRARY_PATH?

csx
fonte
Por que você editou a maior parte de sua pergunta enquanto ela fornecia algum contexto útil para entender seu problema?
Jlliagre
@jlliagre Concordo: sem o contexto fornecido pela pergunta original, a resposta mais votada não faz sentido. Eu rolei de volta.
John1024

Respostas:

25

como faço para definir a variável env LD_LIBRARY_PATH?

Você já o definiu quando fez isso:

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/lib64

Mas isso não vai resolver o seu problema. $LD_LIBRARY_PATHé consultado no momento da execução, para fornecer uma lista de diretórios adicionais nos quais procurar bibliotecas dinamicamente vinculáveis. Não é consultado no momento do link (exceto talvez para localizar bibliotecas necessárias pelas próprias ferramentas construídas!).

Para informar ao vinculador onde encontrar bibliotecas no momento da construção, você precisa usar a -Lopção vinculador. Você já fez isso também:

-L /usr/lib64

Se você ainda estiver recebendo o erro, precisará verificar se a biblioteca está realmente lá. Você tem um arquivo libboost_regex-mt.soou libboost_regex-mt.anesse diretório (ou em algum)? Observe que um arquivo como libboost_regex-mt.so.othersuffixnão conta para esse fim. Se você não tiver isso, provavelmente precisará instalar o pacote de desenvolvimento da sua distribuição para esta biblioteca.

Celada
fonte
No Linux, de acordo com a página do manual ld (1), $LD_LIBRARY_PATHtambém é consultado por ld: «5. Para um vinculador nativo, pesquise o conteúdo da variável de ambiente" LD_LIBRARY_PATH ". »
vinc17 17/11/14
@csx - qual é a sua distribuição? Ubuntu, Fedora, CentOS, etc? Veja aqui, por exemplo: stackoverflow.com/questions/15874220/…
slm
@ vinc17, Essa citação da página de ldmanual refere-se apenas a dependências recursivas: bibliotecas dependentes de uma biblioteca que já foram selecionadas para serem vinculadas. Não se trata de encontrar bibliotecas para o executável que está sendo construído. Isso é o que -Lfaz.
Celada
@csx Eu não sei nada sobre linux científico, mas se apt-getvocê der um comando não encontrado, não será derivado do Debian, então você precisará de outro método para instalar o pacote que está faltando. Definitivamente, esse é o seu problema.
Celada #
Late but: -Ldir -llibdeve funcionar como argumento para ldou para gcc/g++/etcincluir a fase de link, mas o Q original e restaurado menciona make: com um makefile normal que você provavelmente precisa LDFLAGS="whatever"e com um makefile inteligente, você pode precisar de quase qualquer coisa, incluindo tijolos para atirar no autor inteligente do makefile.
dave_thompson_085
11

Outra maneira de adicionar permanentemente um novo caminho no LD_LIBRARY_PATH:

Edite o .confarquivo em /etc/ld.so.conf.d/.

Eu já instalei um aplicativo e suas bibliotecas não puderam ser reconhecidas por outro aplicativo. Então eu adiciono o caminho, ou seja /usr/local/hdf5/lib, ao x86_64-linux-gnu.confarquivo. Basta colocar na próxima linha. Salve .

Então corra sudo ldconfig

Funcionou.

PS: Sistema operacional Ubuntu 14.04

iparjono
fonte
4

Você pode configurá-lo em seu ~/.profilee / ou arquivo init específico do seu shell (por exemplo, ~/.bashrcpara bash, ~/.zshenvpara zsh). Então você precisa reiniciar o seu shell (e possivelmente sair e entrar novamente, dependendo da sua escolha).

Você pode verificar suas configurações com:

env | grep '^LD_LIBRARY_PATH'

EDIT: LD_LIBRARY_PATHé para bibliotecas compartilhadas que contêm código de máquina, cujos nomes de arquivos geralmente contêm .soem seu nome, possivelmente seguidos por números separados por pontos para distinguir versões diferentes. É possível que LD_LIBRARY_PATH, apesar de , uma biblioteca não tenha sido encontrada devido à incompatibilidade da ABI. Observe também que linguagens (como Perl e Python) e pacotes podem ter seu próprio sistema de bibliotecas (possivelmente também com .soarquivos), não relacionados a LD_LIBRARY_PATH.

vinc17
fonte
Meu programa compilado ainda reclama por não encontrar uma biblioteca python, embora eu veja o caminho correto usando env | grep '^ LD_LIBRARY_PATH'. Qual poderia ser o problema?
Herman Toothrot
@HermanToothrot Atualizei minha resposta. Observe que o python possui seu próprio sistema de bibliotecas. Eu suspeito que ele não usa LD_LIBRARY_PATH(para evitar colisões com as bibliotecas habituais). Você precisa fazer uma pergunta específica para isso, com a mensagem de erro recebida.
vinc17 01/03
3

Se o erro do caminho da sua biblioteca estiver no vinculador, durante a compilação, você precisará adicionar o caminho à biblioteca na variável $ LD_LIBRARY_PATH. Se o erro da biblioteca é quando você realmente executa o programa compilado, é necessário adicionar o caminho da biblioteca ao /etc/ld.so.conf e executar o ldconfig para reconstruir o cache do caminho de pesquisa da biblioteca.

Gary
fonte
isso funcionou muito bem! Meu arquivo conf aponta para este diretório /etc/ld.so.conf.d, portanto, basta adicionar um arquivo com o caminho da sua biblioteca nessa pasta. Também certifique-se de executar ldconfig como root (ou sudo-lo)
RLaaa
0

Resolvido com:

adicionar em /etc/systemd/system/pm2-node.service

Environment=PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/app/nodejs/local/nvm/versions/node/v7.8.0/bin:/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
Environment=PM2_HOME=/home/node/.pm2
Environment=LD_LIBRARY_PATH=/opt/oracle/instantclient_12_2
Environment=OCI_LIB_DIR=/opt/oracle/instantclient_12_2
Dave
fonte