%20da%20biblioteca%20seja%20usada.png)
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 X
e o sistema fornece a versão Y
(X>Y). Eu compilei esta biblioteca e coloquei os arquivos /opt/lib_name/X/lib
resultantes Y
em /usr/lib64
. Quero vincular-me so
a bibliotecas.
Agora eu gostaria de criar algum script que de alguma forma habilite version X
, para que qualquer código que eu construa gcc
seja compilado em version X
sem quaisquer alterações nos makefiles.
Por enquanto eu defino LIBRARY_NAME_DIR
a 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_PATH
parece ser que qualquer -L
opção tem precedência. Se por algum motivo o gcc
comando 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/lib64
nã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_PATH
variá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 -rpath
o que LIBRARY_PATH
faz for -rpath
, exceto que especifica quaisquer -rpath
meios que LIBRARY_PATH
serã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 gcc
inclua 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 make
como:
PATH=/path/to/script:$PATH make