Como ligar bibliotecas diferentes (incompatíveis) em tempo de execução dependendo do programa?

2

Eu tenho vários códigos legados que precisam ser compilados com bibliotecas específicas (e muitas vezes conflitantes). Para ser específico, eu tenho um programa que só pode ser compilado com g77 e outro programa que só pode ser compilado com gfortran .

Vamos chamar o primeiro programa de makee e o segundo programa UVES_popler .

Ao compilar (e executar), ambos precisam estar vinculados à versão do pgplot que é compilado com o respectivo compilador. Então, compilar o makee com o g77 precisa ser executado com pgplot que também foi compilado por g77 . E o mesmo, respectivamente para UVES_popler e gfortran .

Vamos supor que eu possa compilar o pgplot com g77 e gfortran - qual é a melhor prática para organizar o meu bashrc? Devo criar uma função bash para cada programa e ter os links apropriados e LD_LIBRARY_PATH s? Algo como:

runmakee() {
  export LD_LIBRARY_PATH=/path/to/g77-pgplot/
  makee
}

E (provavelmente de forma relacionada) existe uma maneira de configurar sinalizadores em Makefiles para que as bibliotecas apropriadas sejam chamadas ao compilar estes programas respectivamente?

    
por JBWhitmore 30.10.2012 / 06:44

1 resposta

2

Suas funções bash devem funcionar, mas a maneira "usual" de fazer isso é escrever um script wrapper para cada executável e definir qualquer coisa que precise ser definida lá. (Você pode alterar o nome do executável para foo.bin , por exemplo, e chamar o script de invólucro foo para facilitar a chamada.)

Para destinos ELF (não tenho certeza sobre outros formatos de objeto), você também pode definir a opção -rpath linker para codificar um caminho de pesquisa de biblioteca de tempo de execução em seus executáveis diretamente. Com o gcc (para código C), para o estágio de link final, seria parecido com:

gcc ... -Wl,-rpath,/your/hardcoded/path ...

Eu assumo que os compiladores Fortran têm opções similares, ou que você pode alterar as opções do link diretamente (neste caso a opção é -rpath /your/path ).

    
por 30.10.2012 / 07:41