Linkagem C++

1. Linkagem C++

Mauricio Souza Klein
Hebang

(usa Arch Linux)

Enviado em 26/11/2010 - 15:26h

Ola!

Pessoal, alguem sabe como eu posso dizer para o g++ procurar bibliotecas em um diretório específico antes de buscar no diretório default.

Exemplo: Eu tenho um código que utiliza uma biblioteca dinâmica abc.so. Essa biblioteca encontra-se em /home/usuario/libs/abc.so e em /lib/abc.so. O que quero é que, na hora de rodar, o programa procure a lib na pasta /home/usuario/libs/ e, se não achar lá, procurar em /lib/. Alguém sabe como faço isso?
Tentei alterar o conteudo das variaveis LD_PATH e LD_LIBRARY_PATH. Dou um ldd no executavel e ele mostra que linkou a lib em /home/usuario/libs/. Porém, quando coloco em outra máquina, ele sempre busca em /lib/.

Outra coisa: alguém sabe qual flag do g++ eu uso para ele linkar a biblioteca diretamente? Isso é, ao invés de linkar usando um link dinâmico, ele siga todos os links e linke a biblioteca propriamente dita.

Muito obrigado pela atenção de todos!


  


2. Re: Linkagem C++

Rodrigo Chaves
stilldre

(usa Funtoo)

Enviado em 26/11/2010 - 15:30h

como você está compilando esse código? poste mais informações e quem sabe podemos ajudar... (eu compilo minhas aplicações com qmake e make) qualquer coisa dá uma olhada em: http://www.network-theory.co.uk/docs/gccintro/gccintro_25.html http://www.yolinux.com/TUTORIALS/LibraryArchives-StaticAndDynamic.html e http://stackoverflow.com/questions/2001141/why-doesnt-g-link-with-the-dynamic-library-i-create


3. Re: Linkagem C++

Mauricio Souza Klein
Hebang

(usa Arch Linux)

Enviado em 26/11/2010 - 15:36h

Ola! Obrigado pela resposta!

Estou usando um Makefile escrito a mão. Todas as bibliotecas que meu programa precisa são linkadas automaticamente (com excessão da pthreads).

Atualmente, estou usando só -I/home/usuario/libs/, porém não está funcionando.

Minha linha é a seguinte:
g++ -pthread -I/home/usuario/libs/ meu_programa.cpp -o executavel

Já tentei o seguinte:
cd /home/usuario/
LD_PATH=libs/
LD_LIBRARY_PATH=libs/
export LD_PATH
export LD_LIBRARY_PATH

Quando faço os passos acima e dou um ldd no executavel, ele mostra que todas as bibliotecas linkadas estão em libs/[biblioteca], o que é o que desejo. Logo, copio o executavel e a pasta libs/ para outra máquina. Porém, quando dou um ldd na outra máquina, ele volta a linkar em /lib/[biblioteca].


4. Re: Linkagem C++

Rodrigo Chaves
stilldre

(usa Funtoo)

Enviado em 26/11/2010 - 15:46h

declare as variáveis no makefile e compile usando make... o gcc -I etc,etc é muito trabalhoso pra ser mandado à mão assim. dê uma lida nos links que mandei...


5. Re: Linkagem C++

Mauricio Souza Klein
Hebang

(usa Arch Linux)

Enviado em 26/11/2010 - 15:50h

Estou lendo seus links e, se algum der resultado, posto aqui.

A solução que indicou não funciona, pois as variaveis so valem para o shell em que o programa foi compilado. Se levar para outra maquina, elas são resetadas. E não posso alterar essas variaveis em outras maquinas, pois pode fazer com que outros programas se percam (como ja ocorreu aqui).

Eu utilizo make para compilar.


6. Re: Linkagem C++

Rodrigo Chaves
stilldre

(usa Funtoo)

Enviado em 26/11/2010 - 15:55h

o makefile não vai com o pacote???


7. Re: Linkagem C++

Mauricio Souza Klein
Hebang

(usa Arch Linux)

Enviado em 26/11/2010 - 15:58h

Não porque eu não preciso dele no destino. Só é utilizado para compilar o programa. No destino, quero rodar o compilado direto.


8. Re: Linkagem C++

Perfil removido
removido

(usa Nenhuma)

Enviado em 26/11/2010 - 16:01h

Não e´so fazer assim:
g++ programa.cpp -Ibribriotteca.a
?


9. Libs e o g++

Anderson de Oliveira Madeira
enki

(usa Zenwalk)

Enviado em 26/11/2010 - 16:03h

Pro g++ procurar primeiro num diretóri específico você usa a opção -L seguido do diretório e logo depois as libs que ele irá procurar, por exemplo:

$ g++ code.cpp -Wall -O2 -I /home/enki/include/ -L /home/enki/lib/ -lSDL

onde:

-I seguido do diretório define um local onde o g++ vai procurar os arquivos de cabeçalho que foram incluídos, antes de procurar nos diretórios do sistema (/usr/include, /usr/local/include, etc.).
-L seguido do diretório define um local onde o g++ vai procurar as libs e linkar com o executável final, ele vai procurar nesse diretório antes de procurar nos default.
-Wall mostra os warnings.
-O2 gera o executável otimizado, quanto maior o número maior mais otimizado (nunca fiz testes pra saber o quão otimizado fica)

E por último, não entendi o que você quis dizer com "Outra coisa: alguém sabe qual flag do g++ eu uso para ele linkar a biblioteca diretamente? Isso é, ao invés de linkar usando um link dinâmico, ele siga todos os links e linke a biblioteca propriamente dita.". Você se refere às bibliotecas estáticas? Se for isso você pode criar libs estáticas com o ar do GNU, informações de como criar libs estáticas e usá-las em:

http://en.wikipedia.org/wiki/Ar_%28Unix%29

Qualquer dúvida, posta aí, flw.


10. Re: Linkagem C++

Mauricio Souza Klein
Hebang

(usa Arch Linux)

Enviado em 26/11/2010 - 16:11h

Sim, já usei o -I e -L, porém a questão é que há algumas libs que não são explicitamente chamadas.

Tipo, quando compilo um código, automaticamente ele linka a libc.so por exemplo. O que preciso é que o meu executavel use a libc.so que esta em /home/usuario/libc.so ao invés da que está em /libs/libc.so.

Quanto a duvida nao entendida é o seguinte: quando dou o ldd em um executavel, ele me diz o caminho de todas as libs que ele usa.

Por exemplo: libc.so -> /libs/libc.so
Significa que ele usa a lib chamada "libc.so" localizada em "/libs/libc.so".

Porém, quando dou um "file /libs/libc.so", ele me diz que /libs/libc.so é um link dinâmico para /usr/libs/libc.so por exemplo. O que quero é que ele linke direto na /usr/libs/libc.so, e não na /libs/libc.so.


11. Re: Linkagem C++

Rodrigo Chaves
stilldre

(usa Funtoo)

Enviado em 26/11/2010 - 16:25h

não sei se entendi direito, mas essa lib em questão é uma dependência do programa e deve acompanhá-lo na hora da instalação... ela precisa estrar devidamente instalada na máquina alvo... a melhor maneira pra resolver isso é usar bibliotecas estáticas... vide links acima.


12. kkk

João Marcos Menezes
stremer

(usa Arch Linux)

Enviado em 26/11/2010 - 18:11h

juro que dei muita risada qdo vi sobre a gambiarra acima...

bem o que você quer é uma linkagem estatica e não dinamica...
g++ -static -o main main.cc





01 02



Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts