Como configurar meu ambiente de forma que uma versão adequada (diferente da do sistema) da biblioteca seja usada

Como configurar meu ambiente de forma que uma versão adequada (diferente da do sistema) da biblioteca seja usada

Acho que esta questão é um limite entre ServerFault e StackOverflow e este site. Mas acho que U&L é mais relevante.

Eu tenho algum C++código que depende de uma biblioteca na versão Xe o sistema fornece a versão Y(X>Y). Eu compilei esta biblioteca e coloquei os arquivos /opt/lib_name/X/libresultantes Yem /usr/lib64. Quero vincular-me soa bibliotecas.

Agora eu gostaria de criar algum script que de alguma forma habilite version X, para que qualquer código que eu construa gccseja compilado em version Xsem quaisquer alterações nos makefiles.

Por enquanto eu defino LIBRARY_NAME_DIRa variável e no makefile eu apenas acrescento -L $LIBRARY_NAME_DIR, o que funciona, mas exige que eu altere os makefiles.

Existe alguma maneira de fazer esse tipo de coisa sem ter acesso root ao computador.

Nota: embora eu acredite que a resposta a esta pergunta não dependa da biblioteca específica ou do código, todos os detalhes do meu problema específico estão aqui:https://stackoverflow.com/q/24189130/7918.

O que eu tentei:

  • Eu arrumei: LIBRARY_PATH, LD_LIBRARY_PATH, CPLUS_INCLUDE_PATH.

Responder1

Não creio que haja alguma maneira de fazer isso de forma robusta e puramente com variáveis ​​ambientais. O problema de usar LIBRARY_PATHparece ser que qualquer -Lopção tem precedência. Se por algum motivo o gcccomando tiver -L/usr/lib64, este será pesquisado primeiro e a versão mais antiga da biblioteca será encontrada. Aparentemente você vai alterar os Makefiles, você também deve tomar cuidado para que a -L/usr/lib64não apareça primeiro.

Olhando para sua pergunta SO, não parece que o que foi dito acima seja um problema. No entanto, há um rastreamento desnecessário :no valor da sua LIBRARY_PATHvariável, o que pode explicar por que ela não funcionou.

Além disso, conforme observado na resposta à pergunta SO, LD_LIBRARY_PATHé usado pelo vinculador dinâmico e só é relevante emtempo de execuçãopara sua aplicação. Isto pode ser usado se o local das bibliotecas dinâmicas não puder ser encontrado quando o aplicativo for executado. O que é usado pelo vinculador GNU é LD_RUN_PATH, que essencialmente faz -rpatho que LIBRARY_PATHfaz for -rpath, exceto que especifica quaisquer -rpathmeios que LIBRARY_PATHserão ignorados (e não apenas com menor precedência).

O que você poderia tentar então é:

LIBRARY_PATH=/opt/lib_name/X/lib LD_RUN_PATH=/opt/lib_name/X/lib make

Algo que pode ser mais robusto é criar um script wrapper que gccinclua as opções necessárias, por exemplo:

#!/bin/sh
gcc -L/opt/lib_name/X/lib -Wl,-rpath,/opt/lib_name/X/lib "$@"

Dê um nome ao arquivo gcc, torne-o executável e coloque-o em um diretório próprio (ou pelo menos em um onde não haja arquivos com o mesmo nome dos comandos vitais). Então você poderia executar makecomo:

PATH=/path/to/script:$PATH make

informação relacionada