Como inserir uma bibliteca externa no gcc

Iniciado por almodenah, 22 de Dezembro de 2011, 23:52

tópico anterior - próximo tópico

almodenah

Olá a todos. Sou uma iniciante e uso o ubuntu 11.10. Meu problema: estou tentando  rodar um programa em C++ pelo terminal e que precisa de uma biblioteca digamos externa que eu obtive de um site , porém eu não sei como fazer na hora que tento compilar  que se ache a maldita biblioteca. A biblioteca em questão chama-se smile e é usada para o calculo de redes Bayesianas e no site de onde fiz o download há uma versão linux para o gcc 4.4.5 , o arquivo tem a extensão .tar.gz eu fiz a descompactação na própria pasta dos Downloads que é onde também deixei o código. Pelo que eu pude aprender até agora eu deveria usar um flag -L para localizar a biblioteca. O que eu fiz:
almodenah@PCAlmo:~/Downloads$ gcc -o teste -L/home/almodenah/Downloads teste.cpp -lsmile
risco.cpp:4:19: erro fatal: smile.h: Arquivo ou diretório não encontrado
compilação terminada.
Bom eu pensei que talvez eu devesse instalar esta biblioteca ou colocá-lo no diretório /usr/lib/gcc mas não sei se isso é correto.
Alguém pode me ajudar ? Espero ter sido clara nas minhas dúvidas e no título do meu tópico. ???

Tota

Ola

Movido para a sessão => programação e scripts

Para maior visibilidade do forum

[]'s

rudregues

Citação de: almodenah online 22 de Dezembro de 2011, 23:52
Olá a todos. Sou uma iniciante e uso o ubuntu 11.10. Meu problema: estou tentando  rodar um programa em C++ pelo terminal e que precisa de uma biblioteca digamos externa que eu obtive de um site , porém eu não sei como fazer na hora que tento compilar  que se ache a maldita biblioteca. A biblioteca em questão chama-se smile e é usada para o calculo de redes Bayesianas e no site de onde fiz o download há uma versão linux para o gcc 4.4.5 , o arquivo tem a extensão .tar.gz eu fiz a descompactação na própria pasta dos Downloads que é onde também deixei o código. Pelo que eu pude aprender até agora eu deveria usar um flag -L para localizar a biblioteca. O que eu fiz:
almodenah@PCAlmo:~/Downloads$ gcc -o teste -L/home/almodenah/Downloads teste.cpp -lsmile
risco.cpp:4:19: erro fatal: smile.h: Arquivo ou diretório não encontrado
compilação terminada.
Bom eu pensei que talvez eu devesse instalar esta biblioteca ou colocá-lo no diretório /usr/lib/gcc mas não sei se isso é correto.
Alguém pode me ajudar ? Espero ter sido clara nas minhas dúvidas e no título do meu tópico. ???

Tente usar -I no lugar de -L (a flag com i maiúsculo em vez de l maiúsculo), pelo menos funcionou pra um cara aqui http://ubuntuforums.org/showthread.php?t=636710
No caso, o comando que esse cara rodou foi gcc -Wall -ansi -I/home/pckong/UNP_book_src/unpv13e/lib -c daytimetcpcli.c

   [ ]'s
Gentoo — Controle total sobre o sistema.

Darcamo

Para compilar e linkar seu programa com bibliotecas externas você precisa dizer para o gcc/g++ as seguintes coisas:

  • Onde estão os cabeçalhos .h dessas bibliotecas?
  • Onde estão as versões compiladas das bibliotecas?
  • Com quais bibliotecas ele deve linkar?

Para responder essas perguntas (nessa ordem) você passa no comando de compilação as flags "-I", "-L" e "-l" (L minúsculo).
Você fez quase tudo e faltou apenas dizer onde o compilador pode encontrar os cabeçalhos .h.
O comando de compilação ficaria
~/Downloads$ gcc -o teste -IPasta_com_os_arquivos_ponto_h -L/home/almodenah/Downloads teste.cpp -lsmile

ps: Ao invés de "-lsmile" você poderia simplesmente escrever o nome completo do arquivo da biblioteca compilada (mas sem o "-l") que também funcionaria. Suponho que nesse caso seja "libsmile.so", certo?

almodenah

Olá amigos obrigada pelas respostas.
Darcamo uma dúvida eu coloquei a pasta que eu chamei de smile com os arquivos .h e dois pacotes com bibliotecas estáticas em /usr/local/lib/smile, a biblioteca que eu quero usar é  libsmile.a não há nenhuma com extensão .so  apenas a que eu preciso usar e uma outra libsmilearn.a. No caso as versões compiladas das bibliotecas estão em libsmile.a não é ? Bom eu fiz do seguinte modo :
abri um terminal onde está o código do programa no caso em Downloads
~Downloads$ gcc -o teste -I/usr/local/lib/smile -L/usr/local/lib/smile  teste.cpp -lsmile 
mas a verdade é que não deu muito certo eu desconfio que do fato de que eu não tenho este arquivo libsmile.so fazendo como está acima apareceu uma tela cheia de mensagens que por ser muito grande eu não vou colocar aqui e no final isto "collect2: ld returned 1 exit status".
Agradeço desde já. :)

Darcamo

Arquivos .a também são bibliotecas. A diferença é que .so são bibliotecas para linkagem dinâmica enquanto que .a são biblioteca para linkagem estática.
Esperimenta o comando
gcc -o teste -L/home/almodenah/Downloads teste.cpp libsmile.a
Se bem que "-lsmile" deveria funcionar também.

Pode ser que essa biblioteca tenha sido compilada para uma outra plataforma (para 64 bits e vc usa 32 bits, por exemplo), ou com uma versão diferente do gcc e com incompatibilidade binária com a versão que vc está tentando compilar, etc.
Se você tiver os fontes dessa biblioteca você pode tentar compilá-la vc mesmo. Assim deve dar certo.

Uma dica para identificar problemas: se o gcc compilou tudo, mas deu erros de referência indefinida para alguma função, quer dizer que o problema é na linkagem (faltou linkar com alguma biblioteca, ou não conseguiu linkar com as que vc tentou, etc). Se no entanto ele nem compilou e reclamou que não achou um cabeçalho .h ou não conhece uma certa função, como foi no caso do erro "erro fatal: smile.h: Arquivo ou diretório não encontrado" aí normalmente é indicar para o compilador onde (em que pasta) encontrar o cabeçalho que falta e/ou dar um "#include cabeçalho.h" que vc esqueceu. No caso do C++ pode ser também o namespace que vc esqueceu de especificar e ele também não encontra uma função.

almodenah

Oi Darcamo consegui compilar o programa  do modo como você tinha me dito anteriormente o que eu mudei foi apenas que eu coloquei "/ " no final de cada localização dos flags e não sei se tem diferença mas ao invés de gcc eu coloquei g++ e gerou o executável. ;D
~/Downloads$ g++ -o teste -I/usr/local/lib/smile/  -L/usr/local/lib/smile/  teste.cpp -lsmile


Depois eu tentei executar o com  ~/Downloads$./teste e ele imprimiu na tela a primeira frase do programa e depois a mensagem " falha de segmentação " , isto pode se um problema do código ?

Darcamo

gcc compila programa em C, enquanto que g++ compila programa feito em C++.
Como código em C também é código válido em C++ então da o g++ compila os dois.

Falha de segmentaçao já é bug no programa. Erros comuns que causam isso são usar ou deferenciar ponteiro não inicializado (ou deletado),
tentar acessar um elemento fora de um vetor, etc..

Para descobrir onde estar o problema só debugando ou imprimindo algo na tela em diferentes partes do seu programa para tentar descobrir em que parte ele dá problema.

almodenah

Oi Darcamo, só queria te agradecer pela ajuda, foi super útil ! :D
Feliz ano !! : :)

Darcamo

Fico feliz em ajudar.
Até porque sei muito bem o tempo que se perde brigando com o compilador em C/C++ até se entender melhor como as coisas funcionam e o que cada erro quer dizer.