Qt em /opt/ variáveis de ambiente

1. Qt em /opt/ variáveis de ambiente

Matheus Saraiva da Silva
matheusssilva

(usa Fedora)

Enviado em 02/07/2014 - 14:42h

Criei uma biblioteca compartilhada que usa Qt, a compilação e linkagem rola perfeitamente, mas ao verificar as dependências dela com 'ldd' percebo que não está sendo encontrado o local das bibliotecas do Qt:

ldd libdynamicqtwidgets.so
linux-vdso.so.1 => (0x00007fffcabfe000)
libQt5Core.so.5 => not found
libQt5Widgets.so.5 => not found
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f5084f6a000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f5084d54000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f508498e000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f5084687000)
/lib64/ld-linux-x86-64.so.2 (0x00007f508550e000)


O path para o Qt é /opt/Qt/5.3/gcc_64/lib

Pesquisando na net vi algumas possíveis soluções com LD_LIBRARY_PATH e outra criando configurações em /etc/ld.so.conf.d

Estou usando ubuntu 14.04


  


2. Re: Qt em /opt/ variáveis de ambiente

Paulo
paulo1205

(usa Ubuntu)

Enviado em 02/07/2014 - 17:26h

Outra possibilidade é você amarrar o caminho no momento da invocar o linker, através da diretiva “-rpath”.

Um aspecto interessante é que a diretiva “-rpath” aceita uma especificação relativa ao diretório onde estiver instalada a aplicação, usando a macro “$ORIGIN”, que é resolvida em tempo de execução. Isso facilita a redistribuição do seu programa, mesmo sem usar necessariamente ligação estática.


3. Re: Qt em /opt/ variáveis de ambiente

Matheus Saraiva da Silva
matheusssilva

(usa Fedora)

Enviado em 02/07/2014 - 17:39h

paulo1205 escreveu:

Outra possibilidade é você amarrar o caminho no momento da invocar o linker, através da diretiva “-rpath”.

Um aspecto interessante é que a diretiva “-rpath” aceita uma especificação relativa ao diretório onde estiver instalada a aplicação, usando a macro “$ORIGIN”, que é resolvida em tempo de execução. Isso facilita a redistribuição do seu programa, mesmo sem usar necessariamente ligação estática.


Você poderia demonstrar diretamente no meu makefile? Estou começando a meter a mão em makefiles, provavelmente terei que procurar exemplos dessa diretiva e dessa variável e passarei o dia inteiro nisso. Segue meu makefile:

#path for Qt
QT = /opt/Qt/5.3/gcc_64

#path for libs Qt
LIBSQT = -L$(QT)/lib/

#path for includes Qt
INCSQT = -I$(QT)/include/

#generate final lib
libdynamicqtwidgets: dynamicqtwidgets.o
g++ -Wall -shared -o libdynamicqtwidgets.so dynamicqtwidgets.o $(LIBSQT) -lQt5Core -lQt5Widgets -lQt5UiTools

#generate dynamicqtwidgets.o
dynamicqtwidgets.o: dynamicqtwidgets.cpp dynamicqtwidgets.hpp dynamicqtwidgets_global.hpp
g++ -Wall -c -fPIC dynamicqtwidgets.cpp $(INCSQT)

#clear build
clean:
-rm -f -R *.o *~ *.so build


4. Re: Qt em /opt/ variáveis de ambiente

Paulo
paulo1205

(usa Ubuntu)

Enviado em 03/07/2014 - 13:36h

Se o linker for diretamente o ld, ficaria do seguinte modo.

LIBSQT = -rpath=$(QT)/lib -L$(QT)/lib 



Agora, se você quiser que a biblioteca seja procurada, no momento da execução, em um diretório relativo àquele onde a biblioteca está instalada, pode fazer o seguinte.

LIBSQT = -rpath='$$ORGIN'/../lib -L$(QT)/lib 



5. Re: Qt em /opt/ variáveis de ambiente

Matheus Saraiva da Silva
matheusssilva

(usa Fedora)

Enviado em 04/07/2014 - 22:04h

Acabei optando por criar o caminho em /etc/ld.so.conf.d acho que que embarcar o path no binário quebra a portabilidade.

Aproveitando o gancho, eu criei um executável de testes para a lib que criei, porém ao passar ldd nele, ele não acha a biblioteca, mesmo ambos estando no mesmo diretório. Por padrão o binário não procura suas dependências no diretório corrente? Vou ter que criar regra em /etc/ld.so.conf.d denovo?


6. Re: Qt em /opt/ variáveis de ambiente

Paulo
paulo1205

(usa Ubuntu)

Enviado em 07/07/2014 - 03:37h

Não, não busca. Até por motivos de segurança.

Mas você pode usar as indicações que eu fiz acima para conseguir o efeito que quer. É só compilar o programa com "-rapth='${ORIGIN}'".


7. Re: Qt em /opt/ variáveis de ambiente

Matheus Saraiva da Silva
matheusssilva

(usa Fedora)

Enviado em 12/07/2014 - 13:13h

o compilador não está reconhecendo a diretiva rpath

Eis meu makefile

#compiler
CXX = g++

#path for Qt
QT = /opt/Qt/5.3/gcc_64

#path for libs Qt
LIBSQT = -L$(QT)/lib/

#path for includes Qt
INCSQT = -I$(QT)/include/

#path for include taget test
INCOBJTEST = -I../src

#path for moc files
MOCS = -I../mocs

#path for taget test
OBJTEST = -L../build

#All includes
INCS = $(INCSQT) $(MOCS) $(INCOBJTEST)

#All libs
LIBS = $(LIBSQT) $(OBJTEST)

#final target
DynamicQtWidgetsTest: dynamicqtwidgetstest.moc dynamicqtwidgetstest.cpp
$(CXX) -Wall -fPIC -o ../build/$@ $(word 2,$^) $(INCS) -Wl, -rpath='${ORIGIN}' $(LIBS) -lQt5Core -lQt5Test -ldynamicqtwidgets

#Generate moc file
dynamicqtwidgetstest.moc: dynamicqtwidgetstest.hpp
moc dynamicqtwidgetstest.hpp -o ../mocs/dynamicqtwidgetstest.moc





8. Re: Qt em /opt/ variáveis de ambiente

Matheus Saraiva da Silva
matheusssilva

(usa Fedora)

Enviado em 12/07/2014 - 20:07h

O problema foi resolvido removendo o espaço entre -Wl e -rpath, ficando assim:

$(CXX) -Wall -fPIC -o ../build/$@ $(word 2,$^) $(INCS) -Wl,-rpath=$ORIGIN $(LIBS) -lQt5Core -lQt5Test -ldynamicqtwidgets


Porém, apesar de compilar normalmente, continua não localizando a biblioteca.


9. RESOLVIDO

Matheus Saraiva da Silva
matheusssilva

(usa Fedora)

Enviado em 12/07/2014 - 20:56h

$(CXX) -Wall -fPIC -o ../build/$@ $(word 2,$^) $(INCS) -Wl,-rpath,'$$ORIGIN' $(LIBS) -lQt5Core -lQt5Test -ldynamicqtwidgets






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts