Problema para compilar - Glib

Iniciado por Thorn Striff, 04 de Maio de 2010, 00:34

tópico anterior - próximo tópico

Thorn Striff

Olá,
estou tentando implementar a função Commandline Option Parser da biblioteca glib.h, contudo estou com problemas para instalar a biblioteca.

Compilei a versão 2.22 como a documentação sugere (http://library.gnome.org/devel/gtk/unstable/gtk-building.html) mas sempre que tento compilar meu programa recebo o erro: error: glib.h: Arquivo ou diretório não encontrado

Alguém poderia me ajudar?

Darcamo

Você não precisa compilar a glib. Basta instalar o pacote "-dev" da glib que a biblioteca será instalada.
Acredito que seja o pacote libglib2.0-dev.

Com isso você tem a certeza de que a biblioteca é instalada em diretórios padronizados (normalmente /usr/include para os arquivos .h e e /usr/lib para as bibliotecas) e facilita as coisas na hora de usá-la.

Você pode então compilar o seu programa com (não testado)
gcc -o nome_do_executavel seuprograma.c -lglib

Como a biblioteca está uma pasta padrão então não precisa dizer para o compilador onde o arquivo glib.h está, mas você ainda precisa dizer para linkar com a biblioteca glib (ou terá erros de undefined reference).

Ps: se o linkador não achar a glib tenta -lglib-2.0 no comando. Na verdade provavelmente esse é o correto já que eu tenho a glib instalada e na pasta /usr/lib aqui tem o arquivo libglib-2.0.a.

Thorn Striff

Obrigado pela ajuda Darcasmo!

Eu já tenho o pacote libglib2.0-dev instalado e mesmo executando o compilador com -lglib, -lglib-2.0 continuo recebendo o mesmo erro :-/

Darcamo

Aqui no meu sistema o arquivo glib.h na verdade fica na pasta /usr/include/glib-2.0
Logo, eu poderia usar #include <glib-2.0/glib.h>

Mas ao invés disso tente passar a opção
-I/usr/include/glib-2.0
na hora de compilar. Isso vai dizer para o gcc/g++ procurar também nessa pasta e ele deve encontrar o arquivo glib.h.

Thorn Striff

Agora parece que ele encontrou alguns dos arquivos que precisa, mas mudou o erro:

In file included from /usr/include/glib-2.0/glib/galloca.h:34,
                 from /usr/local/include/glib-2.0/glib.h:32,
                 from tr-raios-multi.**:5:
/usr/include/glib-2.0/glib/gtypes.h:34:24: error: glibconfig.h: Arquivo ou diretório não encontrado
/usr/include/glib-2.0/glib/gtypes.h:410:2: error: #error unknown ENDIAN type


Darcamo

Quando um arquivo .h não é encontrado pelo compilador você pode tentar achá-lo você mesmo e após ver em que diretório usar você adiciona a opção -IDitetório para informar que o compilador deve procurar os headers também nesse diretório. O que fiz aqui foi ir no diretório /usr/include (já que normalmente os headers ficam nessa pasta) e executar o comando
ls *glib*
para ver o que tem "relacionado com a glib" nesse diretório. Foi aí que vi que tem uma pasta chamada glib-2.0 e que dentro dela está o arquivo glib.h. Aí te sugeri passar a opção -I/usr/include/glib-2.0 para o compilador

Com isso você resolveu um problema, mas apareceu outro. Esse arquivo glibconfig.h na verdade está em /usr/lib/glib-2.0/include (sei lá porque os desenvolvedores da glib resolveram colocar ele aqui) então você teria que também passar para o compilador -I/usr/lib/glib-2.0/include para que ele ache esse arquivo.

"Poxa, mas será que não tem uma maneira mais fácil de saber que informações devo passar para o compilador ao invés de procurar os arquivos manualmente e passar uma opção para cada pasta (sem mencionar as opções para o linkador, no caso '-lglib-2.0')?"

A boa notícia é que tem sim.

Existe um programa chamado pkg-config cuja função é justamente retornar o que você deve passar para o compilador/linkador para poder usar uma biblioteca.
Execute em um terminal o comando
pkg-config glib-2.0 --cflags --libs
Ele vai retornar as opções que você deve passar para o compilador (porque especifiquei --cflags) e para o linkador (porque especifiquei --libs).
Aqui no meu sistema o resultado é

-I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include  -lglib-2.0

A-ha, justamente as opções que deu para achar "na unha". Agora é só copiar o resultado e passar para o compilador na hora de compilar seu programa.

Confesso que havia esquecido do pkg-config, mas como nem toda biblioteca suporta o pkg-config (a biblioteca precisa informar essas informações para o pkg-config) é bom saber como se virar sem ele.

Para finalizar, um truque legar que você pode usar é ao invés de rodar o pkg-config e ver o que ele retorna, passar o resultado retornado diretamente para o compilador como mostrado abaixo
g++ -o seu_programa seu_programa.cpp `pkg-config glib-2.0 --cflags --libs`
A mágica é que o shell roda o comando dentro dos "sinais de crase" e passa o resultado para o comando mais externo (o g++). Dessa forma o compilador sabe onde achar os arquivos .h e o linkador sabe que deve linkar com a glib.