Linkagem C++

13. Re: Linkagem C++

Mauricio Souza Klein
Hebang

(usa Arch Linux)

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

uhuahshuah... tbem ri aqui :)

Cara, mas a questão é que há alguns métodos que não podem ser linkados estáticos (getpwnam, por exemplo).

Como podem ver, meu problema é cheio de restrições. Após pensar muuuuito sobre o assunto, vi que o melhor seria linkar as minhas versões de bibliotecas. Logo, criei uma pasta libs/ com as versões certinhas das bibliotecas que preciso. Só preciso fazer com que a p.... do g++ use elas ao invés das do sistema.

A pergunta que não quer calar é: como faço para o meu executável usar as bibliotecas que estão na minha pasta libs e, caso não as encontre lá, procure no sistema?


  


14. entendi

João Marcos Menezes
stremer

(usa Arch Linux)

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

da uma olhada se isso ajuda:
http://www.velocityreviews.com/forums/t287965-static-linking-of-c-libraries-with-gcc-g.html

Apesar que acho que o que você ta querendo mesmo é algo como o LoadLibrary no mundo windows... para carregar a lib a partir do diretório que esta o programa e não do sistema... correto???

Vou dar uma pesquisada


15. opa

João Marcos Menezes
stremer

(usa Arch Linux)

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

nunca usei isto... mas parece que tai o que você precisa...
dlopen

http://www.faqs.org/docs/Linux-mini/C++-dlopen.html


16. outro bem legal

João Marcos Menezes
stremer

(usa Arch Linux)

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

http://www.yolinux.com/TUTORIALS/LibraryArchives-StaticAndDynamic.html

Agora se tem alguma biblioteca que não pode ser carregada dessa forma eu não sei... mas no mundo windows sempre usei solução parecida com a LoadLibrary quando não queria usar dlls do próprio windows!


17. Re: Linkagem C++

Mauricio Souza Klein
Hebang

(usa Arch Linux)

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

Pessoal, agradeço a todas as respostas enviadas.

Tenho vários links para ler e podem ter certeza que lerei todos.

Assim que tiver uma solução ou alguma resposta interessante, posto aqui!

Abraço a todos!


18. Re: Linkagem C++

Perfil removido
removido

(usa Nenhuma)

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

já tentou -I/lugar/onde/está/a/lib ?


19. Re: Linkagem C++

Marcelo A. B. Slomp
mslomp

(usa Slackware)

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

pelo que eu entendi, você quer usar uma libc e/ou outra lib do sistema que não a padrão, é isso?
se sim, use -nostdlib e indique o caminho da libc em questão:

g++ blablabla -nostdlib -L/caminho/para/sua/libc


20. Re: Linkagem C++

Mauricio Souza Klein
Hebang

(usa Arch Linux)

Enviado em 30/11/2010 - 12:20h

Mslomp!

É exatamente isso que estava procurando!

Olhe o que fiz:
1) Compilei o código de forma dinâmica e dei um ldd para ver as libs que ele linka;
2) Copiei essas libs para um diretório meu chamado libs/
3) g++ -nostdlib -o meu_exe codigo_fonte.cpp libs/lib1.so.1 libs/lib5.so.6 .............. (traduzindo, coloquei o caminho relativo de todas as libs no final da linha de compilação)

Porém, quando compilo desse forma, ocorre o seguinte erro:

/usr/bin/ld: warning: cannot find entry symbol _start; defaulting to 000000000804b168
/tmp/ccwGFI2K.o: In function `__static_initialization_and_destruction_0(int, int)':
codigo_fonte.cpp:(.text+0x34f2e): undefined reference to `__dso_handle'
codigo_fonte.cpp.cpp:(.text+0x34f7c): undefined reference to `__dso_handle'
codigo_fonte.cpp.cpp:(.text+0x34fe7): undefined reference to `__dso_handle'
codigo_fonte.cpp.cpp:(.text+0x3504c): undefined reference to `__dso_handle'
codigo_fonte.cpp.cpp:(.text+0x350ce): undefined reference to `__dso_handle'
/tmp/ccwGFI2K.o:codigo_fonte.cpp.cpp:(.text+0x35150): more undefined references to `__dso_handle' follow
collect2: ld returned 1 exit status
make: *** [all] Error 1

Será que é alguma lib que eu esqueci de linkar??

Desde já, muitíssimo obrigado pela ajuda de todos!


21. Re: Linkagem C++

Mauricio Souza Klein
Hebang

(usa Arch Linux)

Enviado em 30/11/2010 - 12:43h

Pessoal, descobri nesse topico uma forma facil de resolver esse problema:

http://gcc.gnu.org/ml/gcc-help/2008-07/msg00238.html

Usando as diretivas "-Wl,-rpath=/home/libs/" ele utiliza as libs que estão em /home/libs/ ao invés das que estão instaladas no sistema.

Porém, há uma biblioteca que, mesmo estando dentro de /home/libs/, ele insiste em linkar com a que está em /lib/.
A biblioteca é a ld-linux.so.2. E é exatamente essa bibliteca que dá problema quando copio meu executável + libs para outra distro. Ele usa a do sistema ao invés da minha particular e, como as versões estão beeem distintas uma da outra, o seguinte erro ocorre:

relocation error: /home/libs/libc.so.6: symbol _dl_tls_get_addr_soft, version GLIBC_PRIVATE not defined in file ld-linux.so.6 with link time reference

Vou ver se acho uma solução, mas a maior parte do problema está resolvida \o/\o/\o/\o/\o/\o/



  
01 02



Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts