Como fazer um aplicativo usar biblioteca compartilhada local em vez do sistema um

3

Eu tenho o qtcreator instalado usando o instalador on-line do qt. Ele envia qual a sua própria versão da biblioteca qt. A biblioteca qt também é instalada nos diretórios do sistema, mas eles são mais antigos. Eu tenho problemas com o qtcreator (veja qt-forums ). Suspeitando isso pode ser porque o Qt está usando as bibliotecas do sistema antigo, eu corri qt usando

strace -e open qtcreator.sh

e, de fato, ele usa as bibliotecas em / usr / lib / x86_64-linux-gnu / qtcreator /

Para carregar as bibliotecas corretas, o script qrcreator.sh define LD_LIBRARY_PATH como

/home/<me>/Qt/Tools/QtCreator/lib:/home/<me>/Qt/Tools/QtCreator/lib/qtcreator

isto está correto, mas ainda assim, as bibliotecas de / usr / lib / x86_64-linux-gnu / qtcreator são usadas.

Como posso dizer ao qtcreator para usar as bibliotecas locais apesar da existência das bibliotecas do sistema?

    
por Nathan 05.05.2015 / 18:02

2 respostas

0

Para a opção de Nathan, eu adicionaria patchelf , o que permite alterar o RPATH de um executável. Eu pessoalmente prefiro aplicar RPATH na definição de LD_LIBRARY_PATH e afins, pois o Ubuntu tem problemas para defini-los em profile e também como se não definisse isso em profile , isso economiza a necessidade de um script wrapper.

Para definir um executável RPATH que é relativo ao diretório do aplicativo (se você desejar, isso não é obrigatório), você precisa usar $ORIGIN tomando cuidado para escapar do $ que deve aparecer literalmente (então use $ORIGIN se você invocar patchelf de um shell). Ex. se o aplicativo pertencer a um diretório bin e as bibliotecas pertencerem a um diretório peer lib , você usará $ORIGIN/../lib para o RPATH .

Você também pode usar um RPATH absoluto, se preferir.

Veja Patchelf (nixos.org) .

    
por Hibou57 07.05.2015 / 14:41
0

É possível pré-carregar bibliotecas usando a variável de ambiente "LD_PRELOAD". Basta especificar o caminho completo dos arquivos assim:

export LD_PRELOAD = "/path/to/so1.so /path/to/so2.so"
    
por Nathan 07.05.2015 / 14:29