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

3

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

Eu tenho um código C++ 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 arquivos resultantes em /opt/lib_name/X/lib , versão Y está instalada em /usr/lib64 . Eu quero ligar contra so bibliotecas.

Agora eu gostaria de criar um script que de alguma forma habilita a versão X , então qualquer código que eu construa com gcc é compilado contra a versão X sem nenhuma mudança nos arquivos makefiles.

Por enquanto eu defino LIBRARY_NAME_DIR variable e no makefile eu apenas adiciono -L $LIBRARY_NAME_DIR , o que funciona, mas requer que eu mude 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: link .

O que tentei:

  • Eu defini: LIBRARY_PATH , LD_LIBRARY_PATH , CPLUS_INCLUDE_PATH .
por jb. 13.06.2014 / 14:44

1 resposta

2

Eu não acho que haja alguma maneira de fazer isso de forma robusta puramente com variáveis ambientais. O problema com o uso de LIBRARY_PATH parece ser que qualquer opção -L tem precedência. Se, por alguma razão, o comando gcc tiver -L/usr/lib64 , isso será pesquisado primeiro e a versão mais antiga da biblioteca será encontrada. Aparentemente você vai alterar os Makefiles, você também deve ter cuidado para que um -L/usr/lib64 não apareça primeiro.

Olhando para a sua pergunta SO, não parece que o problema acima seja um problema. No entanto, há% trailing : desnecessário no valor da variável LIBRARY_PATH , o que pode explicar por que não funcionou.

Além disso, conforme observado na resposta à questão do SO, LD_LIBRARY_PATH é usado pelo vinculador dinâmico e só é relevante no runtime para o seu aplicativo. Isso pode ser usado se a localização das bibliotecas dinâmicas não puder ser encontrada quando o aplicativo for executado. O que é usado pelo vinculador GNU é LD_RUN_PATH , que essencialmente faz para -rpath o que LIBRARY_PATH faz para -rpath , exceto que especificar qualquer -rpath significa que LIBRARY_PATH será ignorado (e não apenas menor precedência).

O que você pode 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 de wrapper para gcc que inclua as opções necessárias, por exemplo:

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

Nomeie o arquivo gcc , torne-o executável e coloque-o em um diretório sozinho (ou pelo menos um no qual não haja arquivos com o mesmo nome dos comandos vitais). Então você pode executar make como:

PATH=/path/to/script:$PATH make
    
por 13.06.2014 / 16:05