Fórum Ubuntu Linux - PT
31 de Outubro de 2014, 05:38 *
Olá, Visitante. Faça o login ou registre-se.
Perdeu o seu e-mail de ativação?

Login com nome de usuário, senha e duração da sessão
Notícias: Atualização no plugin de busca para Firefox e Internet Explorer.
 
   Home   Ajuda Regras Pesquisa Login Registre-se  
Anúncios
Páginas: [1]   Ir para o fundo
  Imprimir  
Autor Tópico: Como inserir uma bibliteca externa no gcc  (Lida 2501 vezes)
almodenah
Usuário Ubuntu
*
Deslogado Deslogado

Mensagens: 5


Ver Perfil
« em: 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. Hein?
« Última modificação: 03 de Janeiro de 2012, 19:46 por almodenah » Registrado
Tota
Usuário Ubuntu
*
Deslogado Deslogado

Mensagens: 14.134



Ver Perfil
« Responder #1 em: 23 de Dezembro de 2011, 07:21 »

Ola

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

Para maior visibilidade do forum

[]'s
Registrado
rudregues
Usuário Ubuntu
*
Deslogado Deslogado

Mensagens: 365


Fight!


Ver Perfil WWW
« Responder #2 em: 24 de Dezembro de 2011, 01:47 »

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. Hein?

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
Código:
gcc -Wall -ansi -I/home/pckong/UNP_book_src/unpv13e/lib -c daytimetcpcli.c

   [ ]'s
Registrado

Darcamo
Usuário Ubuntu
*
Deslogado Deslogado

Mensagens: 1.309


Ver Perfil
« Responder #3 em: 25 de Dezembro de 2011, 23:27 »

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
Código:
~/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?
Registrado
almodenah
Usuário Ubuntu
*
Deslogado Deslogado

Mensagens: 5


Ver Perfil
« Responder #4 em: 29 de Dezembro de 2011, 21:22 »

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á. Sorridente
Registrado
Darcamo
Usuário Ubuntu
*
Deslogado Deslogado

Mensagens: 1.309


Ver Perfil
« Responder #5 em: 30 de Dezembro de 2011, 00:33 »

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
Código:
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.
Registrado
almodenah
Usuário Ubuntu
*
Deslogado Deslogado

Mensagens: 5


Ver Perfil
« Responder #6 em: 30 de Dezembro de 2011, 15:00 »

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. Sem Graça
Código:
~/Downloads$ g++ -o teste -I/usr/local/lib/smile/  -L/usr/local/lib/smile/  teste.cpp -lsmile

Depois eu tentei executar o com 
Código:
~/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 ?
Registrado
Darcamo
Usuário Ubuntu
*
Deslogado Deslogado

Mensagens: 1.309


Ver Perfil
« Responder #7 em: 31 de Dezembro de 2011, 01:06 »

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.
Registrado
almodenah
Usuário Ubuntu
*
Deslogado Deslogado

Mensagens: 5


Ver Perfil
« Responder #8 em: 03 de Janeiro de 2012, 19:36 »

Oi Darcamo, só queria te agradecer pela ajuda, foi super útil ! Contente
Feliz ano !! : Sorridente
Registrado
Darcamo
Usuário Ubuntu
*
Deslogado Deslogado

Mensagens: 1.309


Ver Perfil
« Responder #9 em: 03 de Janeiro de 2012, 23:02 »

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.
Registrado
Páginas: [1]   Ir para o topo
  Imprimir  
 
Ir para:  

Powered by MySQL Powered by PHP Tema desenvolvido por FaBMak e n3t0
Powered by SMF 1.1.19 | SMF © 2006-2009, Simple Machines
© 2014 Canonical Ltd. Ubuntu e Canonical são marcas registradas da Canonical Ltd.
XHTML 1.0 válido! CSS válido!