usando ldconfig e ld.so.conf versus LD_LIBRARY_PATH

1

Eu freqüentemente construo várias bibliotecas a partir do código-fonte para brincar, como gmp-6.1.2, mpfr-4.0.1 e gcc-7.x. Ao fazer isso, prefiro usar --prefix=/usr/local/gcc-7.2.0 para saber exatamente onde está instalado e não atrapalhar as bibliotecas existentes. E então, tudo que eu basicamente sei é o que o make install me diz no final, para atualizar ou definir LD_LIBRARY_PATH e às vezes, mas nem sempre LD_RUN_PATH .

na maioria das vezes, defino manualmente LD_LIBRARY_PATH conforme necessário posteriormente ou defina-a globalmente em algo como /etc/bash.bashrc.local e isso funcionou.

Isso é o que o make install diz:

Libraries have been installed in:
  /usr/local/mfprtest/lib

If you ever happen to want to link against installed libraries
in a given directory, LIBDIR, you must either use libtool, and
specify the full pathname of the library, or use the '-LLIBDIR'
flag during linking and do at least one of the following:
  - add LIBDIR to the 'LD_LIBRARY_PATH' environment variable
    during execution
  - add LIBDIR to the 'LD_RUN_PATH' environment variable
    during linking
  - use the '-Wl,-rpath -Wl,LIBDIR' linker flag
  - have your system administrator add LIBDIR to '/etc/ld.so.conf'

See any operating system documentation about shared libraries for
more information, such as the ld(1) and ld.so(8) manual pages.

Existe uma maneira melhor, ou mais oficial? de usar ldconfig and ld.so.conf do que usar LD_LIBRARY_PATH e LD_RUN_PATH e PATH ? Isto é especificamente para escrever meu próprio código, mas pode ser para outros usuários, onde eu quero linkar várias versões mais novas de uma biblioteca do que o que está instalado com uma versão linux, como gmp, mpfr e usando várias versões manualmente instaladas do gcc, como gcc-5.x ou gcc-6.x ou gcc-7.x.

basicamente, uma vez que eu instale o /usr/local/gcc-7.3.0 , por exemplo, eu mesmo e qualquer outro usuário que escreva ou execute c, c ++ ou código-fonte fortran no sistema para usar /usr/local/gcc-7.3.0 e não as versões do sistema em / usr / bin / e / usr / lib64 /

    
por ron 19.02.2018 / 20:02

2 respostas

0

Para os executáveis (em oposição às bibliotecas), os usuários precisarão ter um PATH corretamente configurado em seu ambiente. Isso pode ser feito por meio de seus próprios arquivos de inicialização do shell ou por todo o sistema, por exemplo, por meio de /etc/profile (mas observe que não é garantido que esse arquivo seja lido em todas as configurações).

Agora, para as bibliotecas, como GMP e MPFR:

  1. Se você usou um caminho de execução ao criar o GCC, nada mais precisa ser feito para poder usar o GCC: as bibliotecas serão encontradas por meio do caminho de execução.
  2. Caso contrário, ou se você quiser que os usuários possam usar as bibliotecas diretamente para outros fins (por exemplo, com seu próprio software), usar ldconfig (e possivelmente /etc/ld.so.conf ) pode ser a melhor solução. Mas observe que, se os usuários quiserem compilar essas bibliotecas, também precisarão de LIBRARY_PATH e CPATH (ou C_INCLUDE_PATH , etc.).

Observação: LD_LIBRARY_PATH ainda é útil para coisas temporárias (por exemplo, testes) e para bibliotecas instaladas no diretório pessoal do usuário (não parece haver o equivalente a ldconfig para a configuração do lado do usuário). Mas pode sobrepor o caminho de execução , o que é um problema em alguns casos (por exemplo, make check para verificar uma biblioteca que acabou de ser construída e para a qual uma versão anterior compatível já está instalada).

    
por 07.05.2018 / 14:59
0

A solução para isso é adicionar os diretórios da biblioteca /usr/local/gcc-7.3.0/lib/ a /etc/ld.so.conf (ou um arquivo em /etc/ld.so.conf.d/ ) e executar ldconfig ou alterar os perfis de shell dos usuários para substituir os sistemas ' LD_LIBRARY_PATH / LD_RUN_PATH e inclua as entradas */lib individuais para que o vinculador possa localizar os objetos compartilhados.

Depois de começar a adicionar bibliotecas, a complexidade de manutenção aumenta, por isso tenha isso em mente.

Outra opção é vincular todos os arquivos de /usr/local/<library>/{bin,lib,include} into /usr/local/{bin,lib,include} . Isso simplifica muito o ld.so.conf ou LD_LIBRARY_PATH / LD_RUN_PATH , embora você precise viver com% messy/usr/local/{bin,lib,include}.

A maneira "oficial" de fazer isso é usar o gerenciador de pacotes do sistema e instalar as versões mantidas da distribuição das bibliotecas nos locais escolhidos ( /usr/lib/ , /lib , etc).

    
por 20.02.2018 / 10:57