Erro ao ligar biblioteca ao GCC

Iniciado por Dimas, 08 de Março de 2007, 03:20

tópico anterior - próximo tópico

Dimas

Olá pessoal. Estou querendo brincar um pouco com o libvorbis para fazer um programinha para tocar arquivos .ogg (embora ja existam muitos). É mais como um exercício de C mesmo.

Só que estou tendo problema para compilar o programa, na hora de ligar a biblioteca.

Eis o código do programa


#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <vorbis/codec.h>
#include <vorbis/vorbisfile.h>

int main(int argc, char **argv){

char pcmout[4096];

OggVorbis_File vf;
int eof=0;
int current_section;

FILE *music;

music = fopen(argv[1],"r");
if(music==NULL){
fprintf(stderr, "Não consegui abrir %s\n", argv[1]);
exit(1);
}


if(ov_open(music, &vf, NULL, 0) < 0) {
fprintf(stderr, "Arquivo não parece ser um arquivo no formato Ogg bitstream.\n");
exit(1);
}


   char **ptr=ov_comment(&vf,-1)->user_comments;
   vorbis_info *vi=ov_info(&vf,-1);
   while(*ptr){
     fprintf(stderr,"%s\n",*ptr);
     ++ptr;
   }
   fprintf(stderr,"\nBitstream is %d channel, %ldHz\n",vi->channels,vi->rate);
   fprintf(stderr,"\nDecoded length: %ld samples\n",
           (long)ov_pcm_total(&vf,-1));
   fprintf(stderr,"Encoded by: %s\n\n",ov_comment(&vf,-1)->vendor);


   while(!eof){
    long ret=ov_read(&vf,pcmout,sizeof(pcmout),0,2,1,&current_section);
    if (ret == 0) {
      /* EOF */
      eof=1;
    } else if (ret < 0) {
      /* error in the stream.  Not a problem, just reporting it in
case we (the app) cares.  In this case, we don't. */
    } else {
      /* we don't bother dealing with sample rate changes, etc, but
you'll have to*/
      fwrite(pcmout,1,ret,stdout);
    }
   }

ov_clear(&vf);
   
   fprintf(stderr,"Done.\n");
   return(0);
}


Estou usando o seguinte comando para compilar:
gcc -I/usr/include -L/usr/lib -libvorbis teste.c -o teste

O erro apresentado na compilação éo seguinte:
/usr/bin/ld: cannot find -libvorbis
collect2: ld returned 1 exit status

É como se eu não tivesse a biblioteca instalada. Mas ela está.

Ja tentei outras maneiras de compilar. Eis:
gcc -I/usr/include -L/usr/lib -libvorbisfile -lm teste.c -o teste
gcc -I/usr/include -L/usr/lib -libvorbisfile -libvorbis -lm teste.c -o teste
gcc -I/usr/include -L/usr/lib -libvorbisfile -libvorbis teste.c -o teste

Enfim, ja tentei de várias maneiras e o erro é sempre o mesmo.

Alguém poderia me dar uma ajuda? Estou usando a versão 4.1.2 do GCC.

Obrigado!
Dimas Gabriel
digabriel[at]gmail.com

"Liberdade é a questão, a única e exclusiva questão."

alexmatos

Acredito que o problema esteja na ordem dos elementos. As bibliotecas devem ser linkadas no final do comando. Acho que assim vai funcionar:

gcc teste.c -o teste -I/usr/include -L/usr/lib -libvorbis -lm

Eu não sei bem quais dessas bibliotecas você tem que usar para o seu programa, então talvez seja necessário fazer tentativas como você fez anteriormente, sempre lembrando que as bibliotecas vem no final.

Tenta aí e posta o resultado pra gente...

Dimas

E ai alex.
Não creio que a ordem infuencie em algum momento.

Mas mesmo assim fiz o teste e o erro continua sendo o mesmo. Não é isso. hehe

Obrigado pela ajuda de qualquer forma.
Dimas Gabriel
digabriel[at]gmail.com

"Liberdade é a questão, a única e exclusiva questão."

Diego_Rocha

Só uma pergunta ja tentou fazer assim.


gcc teste.c -o teste -lm -libvorbis


:-\

alexmatos

Citação de: Dimas online 08 de Março de 2007, 11:35
E ai alex.
Não creio que a ordem infuencie em algum momento.

Mas mesmo assim fiz o teste e o erro continua sendo o mesmo. Não é isso. hehe

Obrigado pela ajuda de qualquer forma.

Dimas, tenho certeza que, pelo menos, a biblioteca math.h tem que ser linkada no final com '-lm'. Pode haver outro erro, sim, mas esse é um deles.

Darcamo

Um lembrete, não basta apenas ter o pacote libvorbis instalado. Tem que ter o libvorbis-dev.


Off-topic: Caso esteja interessado, esses dois artigos (em português) dão uma boa introdução sobre o gstreamer
http://www.cin.ufpe.br/~cinlug/wiki/index.php/Apresentando_o_GStreamer
http://www.cin.ufpe.br/~cinlug/wiki/index.php/Criando_Um_Player_de_%C3%81udio_com_GStreamer

Usando o gstreamer vc vai poder tocar vários outros formatos alem do ogg. Os exemplos no artigo estão em python, mas entendendo o funcionamento do gstreamer pelos artigos vc pode ver a documentação do gstreamer depois e programar em C se quizer (ou aprender python  ;D). Tem o código fonte em python de um player simples de mp3 que tem interface gráfica e exibe as informações da música (artista, música). É bem interessante.

Dimas

Valeu Darcamo.

Eu tenho o libvorbis-dev instalado. Não faço idéia do pq não está funcionando.

Valeu pelo link. Vou dar uma olhada e quem sabe faço alguma coisa com o gstreamer.
Dimas Gabriel
digabriel[at]gmail.com

"Liberdade é a questão, a única e exclusiva questão."

Lamego

o -l é uma opção, não faz parte do nome da biblioteca, se a biblioteca se chama vorbis (no sistema fica com libvorbis.*), a sintaxe do comando é:
-lvorbis
Se a biblioteca se chama libvorbis (no sistema ficaria com liblibvorbis.*), a sintaxe seria -llibvorbis, nunca -libvorbis.

João Luís Marques Pinto
Mais programs e jogos para o Ubuntu

Darcamo

Citaro -l é uma opção, não faz parte do nome da biblioteca, se a biblioteca se chama vorbis (no sistema fica com libvorbis.*), a sintaxe do comando é:
-lvorbis
Se a biblioteca se chama libvorbis (no sistema ficaria com liblibvorbis.*), a sintaxe seria -llibvorbis, nunca -libvorbis.

Tá aí o problema. Acabei nem percebendo o erro quando li a linha. O "-l" realmente faz parte da sintaxe do comando. Ele diz que o que vem depois (colado com o "l") é o nome da biblioteca. Só que toda biblioteca tem o prefixo lib e o "-l" já inclui isso. Então na verdade acho que o correto seria -lvorbis.

Dimas

Citação de: Lamego online 09 de Março de 2007, 12:10
o -l é uma opção, não faz parte do nome da biblioteca, se a biblioteca se chama vorbis (no sistema fica com libvorbis.*), a sintaxe do comando é:
-lvorbis
Se a biblioteca se chama libvorbis (no sistema ficaria com liblibvorbis.*), a sintaxe seria -llibvorbis, nunca -libvorbis.



É, realmente: vivendo e aprendendo.

Esse era o problema mesmo. Valeu pela dica/ensinamento  Lamego. Está tudo funcionando agora.
Dimas Gabriel
digabriel[at]gmail.com

"Liberdade é a questão, a única e exclusiva questão."