Problema compilação

1. Problema compilação

Mauricio Souza Klein
Hebang

(usa Arch Linux)

Enviado em 10/01/2011 - 11:24h

Olá pessoal!

Finalizei o desenvolvimento de um programa em C++ que faz uso de várias bibliotecas. Porém preciso que esse código rode em várias distros do Linux, de várias versões diferentes.

Logo, a primeira solução que me veio a cabeça era compilar esse código em uma distro antiga (Fedora 3), carregar as libs nativas desse Linux com o executável e dizer para o executável carregar essas libs ao invés da do sistema. Algo do tipo:
1) copia as libs usadas pelo executável do diretorio padrao do sistema para uma pasta libs/
2) compilar o codigo informando ele para carregar as libs da pasta libs/, e não /usr/lib/

Para isso, na linha de compilação do g++, coloquei a opção -Wl,-rpath,/opt/my_code/libs/

Compilei nesse Fedora 3, e ele executou perfeitamente. dei um ldd no executavel para garantir que ele carregava as libs de /opt/my_code/libs/.

Copiei o executavel e a pasta libs/ para um ubuntu 10.10 e tentei rodar o código, porém o seguinte erro foi retornado:

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

Alguem saberia o que isso significa, e como posso resolver?

Se alguém tiver uma idéia melhor de como tornar meu código portável, será muito bem vinda.

Acredito que haja como, pois vários softwares de código aberto fazem isso (como os navegadores Firefox e Chrome quando são instalados em Linux).

Muito obrigado pela atenção de todos!


  


2. Não carregue as libs com o projeto!

Júlio Hoffimann Mendes
julio_hoffimann

(usa Ubuntu)

Enviado em 10/01/2011 - 11:40h

Oi Mauricio,

A única coisa que seu projeto deve carregar é o código fonte das bibliotecas, se essas não forem onipresentes é claro. Você não vai levar o GCC com o projeto não é?! A que bibliotecas externas se refere?

Siga os padrões, leia as GNU autotools (a famosa sequência: ./configure, make, make install) ou ferramentas equivalentes (CMake, qmake, ...)

Abraço!


3. Re: Problema compilação

Mauricio Souza Klein
Hebang

(usa Arch Linux)

Enviado em 10/01/2011 - 11:51h

Ola!

Obrigado pela resposta!

Meu codigo faz uso de varias bibliotecas (pthread, ssl, crypto, etc...), por isso preciso colocar todas na pasta libs/, para ter a versão correta das mesmas.

Quanto a libc, preciso levá-la junto, pois como vou rodar em várias distros, a diferença de versão da libc entre sistemas pode gerar erros na hora de executar (experiência própria).

Se entendi bem, voce disse que tenho que levar o codigo fonte que gerou as libs junto com o meu executavel, porem sao varias libs, o que torna inviavel e deixa o processo de compilacao/execucao muito lento (imagina compilar a libc :P)

Aguardo mais respostas!


4. Não é maneira correta

Júlio Hoffimann Mendes
julio_hoffimann

(usa Ubuntu)

Enviado em 10/01/2011 - 13:08h

Mauricio,

Definitivamente não é a maneira correta de fazê-lo. Um programa quando bem implementado dificilmente (para não dizer nunca) terá problemas com a libc.

Se você deseja portabilidade, implemente seguindo os padrões estabelecidos nos comitês. Já viu alguma biblioteca carregando a libc? :-)

Esse é o caminho certo e a compilação de outras bibliotecas não é algo que tome o dia inteiro como a compilação do LibreOffice por exemplo. Além do que, será realizada uma única vez para o uso do programa.

Por isso existem as ferramentas de checagem do sistema, como já citei no post anterior. Todas as bibliotecas que vejo fazem uso, esse é um bom indicativo. Caso seja necessário, o usuário é quem instala as dependências. Sem se falar na perfomance de ter todo o projeto compilado na máquina em questão.

Não sei do que se trata o seu projeto, então posso estar falando alguma besteira.

Boa sorte!


5. Re: Problema compilação

Mauricio Souza Klein
Hebang

(usa Arch Linux)

Enviado em 10/01/2011 - 13:48h

Ola!

Amigo, eu sei que há meios mais "corretos" de se fazer isso. Ja programo ha bastante tempo e já tive contato com aplicativos do tipo Cmake, autotools, etc...

O problema e que meu programa trata-se de um aplicativo comercial que será instalado em massa. Por isso, não posso compilar ele na máquina destino, por causa do sigilo intelectual, e não posso gerar dependências para o usuário, uma vez que faremos um script que fará a instalação em várias máquinas ao mesmo tempo, de forma automatizada.

Sei que essas restrições são bastante pesadas, mas quem disse que programar é mamão com açucar :)

Agradeço sua resposta e, se tiver mais alguma idéia, lhe agradeço de antemão e resalto que será muito bem vinda!


6. Outras possibilidades

Júlio Hoffimann Mendes
julio_hoffimann

(usa Ubuntu)

Enviado em 23/01/2011 - 13:22h

Oi Mauricio, tudo certo?

Conseguiu realizar a façanha? Outra coisa que você pode tentar, é linkar tudo estaticamente! O executável vai ficar meio grande, mas acredito que seja uma solução. Você só levará o executável (32/64bits) e mais nada.

Também pode dar uma olhada no parâmetro de compilação '-static-libgcc'

Só para ter uma idéia... poderia mostrar a saída do comando ldd?

$ ldd caminho/para/o/executavel

Abraço!






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts