Localização de bibliotecas compartilhadas [RESOLVIDO]

1. Localização de bibliotecas compartilhadas [RESOLVIDO]

michael
micdoug

(usa Sabayon)

Enviado em 01/02/2013 - 08:42h

Bom dia pessoal,

Estou desenvolvendo um aplicativo usando C++ e o Toolkit QT. Separei alguns elementos do programa em bibliotecas compartilhadas ".so". A minha dúvida é a seguinte: para o executável do meu programa encontrar estas bibliotecas no momento de execução, o diretório das libs tem que estar especificado na variável de ambiente "LD_LIBRARY_PATH" certo? Eu queria um modo para testar a execução do programa antes de sua finalização sem ter que ficar mexendo nesta variável ou sem ter que ficar copiando as libs para uma pasta padrão do sistema. Sei lá, não tem alguma maneira de especificar a localização de libs especificamente para um executável?

O que faço hoje é setar a variável "LD_LIBRARY_PATH" nas configurações de projeto do QT-Creator, e eu acredito que ele só as modifique no momento de execução, porém não acho que esta seja a melhor solução.

Desde já, obrigado.


  


2. MELHOR RESPOSTA

Paulo
paulo1205

(usa Ubuntu)

Enviado em 03/02/2013 - 07:25h

A opção "-rpath", usada no momento da linkedição do programa, permite amarrar a localização de bibliotecas dinânimas. Então, se você instalar seu programa em, digamos, /usr/local/MY_APP, os executáveis poderia ficar em /usr/local/MY_APP/bin e as bibliotecas em /usr/local/MY_APP/lib, e você poderia amarrar esse último local.

3. Re: Localização de bibliotecas compartilhadas [RESOLVIDO]

Paulo
paulo1205

(usa Ubuntu)

Enviado em 03/02/2013 - 07:26h

Acabei de ver que o argumento passado para "-rpath" pode conter algum dinamismo em tempo de execução. Veja o seguinte extrato da manpage do ld.so.

$ORIGIN and rpath

ld.so understands the string $ORIGIN (or equivalently ${ORIGIN}) in an rpath specification (DT_RPATH or DT_RUNPATH) to mean the directory containing the application executable. Thus, an application located in somedir/app could be compiled with gcc -Wl,-rpath,'$ORIGIN/../lib' so that it finds an associated shared library in somedir/lib no matter where somedir is located in the directory hierarchy. This facilitates the creation of "turn-key" applications that do not need to be installed into special directories, but can instead be unpacked into any directory and still find their own shared libraries.



4. Re: Localização de bibliotecas compartilhadas

michael
micdoug

(usa Sabayon)

Enviado em 04/02/2013 - 12:56h

Muito obrigado paulo1205, funcionou certinho, era exatamente o que eu procurava.

Quando você trabalha com o toolkit qt, você tem um arquivo de projeto ".pro" que é usado pelo programa "qmake" para gerar o "Makefile", então bastou acrescentar na variável "LIBS" do arquivo ".pro" os parâmetros "-Wl,-rpath,'$ORIGIN/lib'" e mandar gerar o Makefile normalmente e pronto. A linha com a variável LIBS fica mais ou menos assim:

LIBS += "(...) -Wl,-rpath,'$ORIGIN/lib'""

--> onde (...) se refere aos demais parâmetros que você queira passar como indicar as bibliotecas usadas.

Muito obrigado, até mais.






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts