2009-07-17 13 views
41

Więc oto najprostszy na świecie wygadany Program:Dlaczego nie mogę zbudować "cześć świata" dla glib?

#include <glib.h> 

próbuję skompilować go z gcc test.c i uzyskać:

test.c:1:18: error: glib.h: No such file or directory 

Więc upewnij się, że mam prawo pakiety:

# dpkg -l | grep libglib 
ii libglib-perl        1:1.183-1        Perl interface to the GLib and GObject libra 
ii libglib1.2-dev       1.2.10-19build1       The GLib library of C routines (development) 
ii libglib1.2ldbl       1.2.10-19build1       The GLib library of C routines 
ii libglib2.0-0        2.20.1-0ubuntu2       The GLib library of C routines 
ii libglib2.0-cil       2.12.1-1ubuntu2       CLI binding for the GLib utility library 2.1 
ii libglib2.0-data       2.18.2-0ubuntu2       Common files for GLib library 
ii libglib2.0-dev       2.20.1-0ubuntu2       Development files for the GLib library 
ii libglibmm-2.4-1c2a      2.18.1-1        C++ wrapper for the GLib toolkit (shared lib 

Następnie szukam dowolnego "glib.h" w dowolnym miejscu w katalogu/usr/include. Dostaję dwa, /usr/include/glib-1.2/glib.h i /usr/include/glib-2.0/glib.h. Więc staram:

$ gcc -I/usr/include/glib-2.0 -Wall test.c 
In file included from /usr/include/glib-2.0/glib/galloca.h:34, 
      from /usr/include/glib-2.0/glib.h:32, 
      from test.c:2: 
/usr/include/glib-2.0/glib/gtypes.h:34:24: error: glibconfig.h: No such file or directory 

(około 10.000 więcej błędów snipped)

nie wydają się mieć glibconfig.h w dowolnym miejscu na moim komputerze.

Co mam teraz zrobić?

+1

Może jestem po prostu głupie, ale dlaczego starasz się skompilować nagłówek? – GManNickG

+14

Zacząłem od bardziej złożonego programu, ale jeśli "#include " nie zadziała, nic nie będzie. – mike

+0

Jeśli nie masz głównej funkcji, * nie * będzie działać. Zastępowanie 'glib.h' przez' stdio.h' też nie działa. Zakładając, że masz główną funkcję, właściwą odpowiedzią jest użycie 'pkg-config', jak wspomniano w innej odpowiedzi. –

Odpowiedz

49

glib ma tendencję do ukrywania się ... Twoja instrukcja include nie działa, ponieważ GCC nie wyszukuje automatycznie podkatalogów, a więc nie może zobaczyć glib.h w glib-1.2 lub glib-2.0.

Przeczytaj stronę Compiling GLib Applications w podręcznikach GLIB ... używając komend takich jak pkg-config --cflags glib-2.0, otrzymujesz odpowiednie flagi dla GCC.

kanoniczny sposób zrobić to, co staramy się

% gcc test.c -Wall -o test `pkg-config --cflags --libs glib-2.0` 

Uwaga back-kleszcze, które mówią, że powłoka będzie uruchomić komendę pkg-config „w miejscu”.

+3

To się nie ukrywa: glibconfig.h to lista danych zależnych od łuku, a więc nie odnosi się do/usr/include. Jest powszechnie używany pod/usr/lib/glib2/... – ntd

+0

[This] (http://askubuntu.com/a/90342) dla mnie. – gkiko

-2

apt-get build-dep jest twoim przyjacielem - nikt nie może zapamiętać wszystkich pakietów potrzebnych do zbudowania czegoś.

+2

plik jest tam dostępny, więc polecenie zarządzania pakietami specyficzne dla Debiana nie rozwiąże problemu. poprawne użycie 'pkg-config'. – mlibby

40
> > The canonical way to do what you are trying is 

> % gcc test.c -Wall -o test `pkg-config --cflags --libs glib-2.0` 

Przepraszam, ale nie. Jest to powszechne nieporozumienie, które w większości przypadków działa w systemach opartych na ELF, w szczególności w Linuksie. Kanoniczny sposób jest przejść w CFLAGS i bibliotek osobno, w odpowiednich miejscach i tradycyjnych linii poleceń, tak:

gcc -Wall -o test `pkg-config --cflags glib-2.0` test.c `pkg-config --libs glib-2.0` 

Szkoda że pkg-config akceptuje zarówno --cflags i - -libs opcji w tym samym czasie, ponieważ oznacza to, że ten niepoprawny mem nigdy nie umrze, a ludzie przyzwyczajeni do niego będą nadal zdziwali się, gdy spróbują tego samego na innych platformach.

+1

+1 za odwagę! Ściśle mówiąc nazwa pliku kodu źródłowego powinna iść na końcu, po wszystkich opcjach. –

+6

Przepraszam, ale to nie jest prawda. Czy rzeczywiście próbowałeś zrobić to w ten sposób na platformie innej niż Linux, na przykład MinGW? Zobacz na przykład http://gc.gnu.org/onlinedocs/gcc/Link-Options.html, który wyraźnie mówi: "Różnica polega na tym, że w komendzie piszesz tę opcję, linker wyszukuje i przetwarza biblioteki i pliki obiektów w kolejności, w jakiej zostały określone, więc 'foo.o -lz bar.o 'przeszukuje bibliotekę' z' po pliku foo.o, ale przed bar.o. Jeśli bar.o odnosi się do funkcji w 'z ', te funkcje mogą nie być załadowanym ". – tml

7

Jak @chris powiedział użycie pkg-config

glibconfig.h is missing 

to dlatego, że ten plik nie jest w /usr/include/glib-2.0, ale w /usr/lib/glib-2.0. Więc trzeba to również ten /usr/lib ścieżkę lub skopiować plik do włączenia/glib-2.0

0

Używam glib.h jak dobrze Czy to skompilować wszystkie programy glib.h :)

gcc pkg-config --cflags --libs glib-2.0 filename.c

upewnij się, że otaczasz pkg-config --cflags --libs glib-2.0 z cudzysłowami , które można znaleźć pod tyldą (lewy klawisz na klawiaturze querty).

Thank Me Later ..: P

+0

Czy mógłbyś umieścić "" w swoim kodzie? przez jakiś czas mnie to zdezorientowało. Uznałem za swoją winę, że nie przeczytałem reszty twojej odpowiedzi, ale fragment kodu, jak jest teraz, jest niedokładny. – ALM

+0

o cholera. Tęsknie za tym... –