2012-04-01 6 views
8

Mam problem ze skompilowaniem prostego, przykładowego programu przeciwko glib na Ubuntu. Otrzymuję następujące błędy. Mogę go skompilować, ale nie połączyć z flagą -c, co, jak sądzę, oznacza, że ​​mam zainstalowane nagłówki glib, ale nie znajduje to kodu obiektu współdzielonego. Zobacz także plik Make poniżej.Błędy łącznika podczas kompilacji przeciwko glib ...?

$> make re 
gcc -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -lglib-2.0  re.c -o re 
/tmp/ccxas1nI.o: In function `print_uppercase_words': 
re.c:(.text+0x21): undefined reference to `g_regex_new' 
re.c:(.text+0x41): undefined reference to `g_regex_match' 
re.c:(.text+0x54): undefined reference to `g_match_info_fetch' 
re.c:(.text+0x6e): undefined reference to `g_print' 
re.c:(.text+0x7a): undefined reference to `g_free' 
re.c:(.text+0x8b): undefined reference to `g_match_info_next' 
re.c:(.text+0x97): undefined reference to `g_match_info_matches' 
re.c:(.text+0xa7): undefined reference to `g_match_info_free' 
re.c:(.text+0xb3): undefined reference to `g_regex_unref' 
collect2: ld returned 1 exit status 
make: *** [re] Error 1 

Makefile używane:

# Need to installed libglib2.0-dev some system specific install that will 
# provide a value for pkg-config 
INCLUDES=$(shell pkg-config --libs --cflags glib-2.0) 
CC=gcc $(INCLUDES) 
PROJECT=re 

# Targets 
full: clean compile 

clean: 
    rm $(PROJECT) 

compile: 
    $(CC) $(PROJECT).c -o $(PROJECT) 

.c kod jest kompilowany:

#include <glib.h> 

void print_upppercase_words(const gchar *string) 
{ 
    /* Print all uppercase-only words. */ 

    GRegex *regex; 
    GMatchInfo *match_info; 

    regex = g_regex_new("[A-Z]+", 0, 0, NULL); 
    g_regex_match(regex, string, 0, &match_info); 

    while (g_match_info_matches(match_info)) 
    { 
     gchar *word = g_match_info_fetch(match_info, 0); 
     g_print("Found %s\n", word); 
     g_free(word); 
     g_match_info_next(match_info, NULL); 
    } 

    g_match_info_free(match_info); 
    g_regex_unref(regex); 
} 

int main() 
{ 
    gchar *string = "My body is a cage. My mind is THE key."; 

    print_uppercase_words(string); 
} 

dziwne, kiedy biegnę glib-config, nie lubi tego polecenia, choć nie wiem jak powiedzieć Bashowi lub zrobić, jak użyć jednego z nich, gdy narzeka, że ​​gdlib-config znajduje się w tych dwóch pakietach.

$> glib-config 
No command 'glib-config' found, did you mean: 
Command 'gdlib-config' from package 'libgd2-xpm-dev' (main) 
Command 'gdlib-config' from package 'libgd2-noxpm-dev' (main) 
glib-config: command not found 
+0

Więc jakie było rozwiązanie, nie rozumiem? – user3728501

Odpowiedz

23

biblioteki w celu polecenia kompilatora:

GCC -I/usr/to/płynny-2.0 -I/usr/lib/x86_64-Linux-gnu/glib-2.0/obejmują re.c -o ponownego -lglib-2,0

Z GCC Link Options:

 
-llibrary 
-l library 
    Search the library named library when linking. 
    (The second alternative with the library as a separate argument 
    is only for POSIX compliance and is not recommended.) 

    It makes a difference where in the command you write this option; 
    the linker searches and processes libraries and object files in the 
    order they are specified. 
    Thus, `foo.o -lz bar.o' searches library `z' after file foo.o but 
    before bar.o. If bar.o refers to functions in `z', those functions 
    may not be loaded. 
+1

To się nazywa połączenie jednoprzebiegowe: https://computation.llnl.gov/casc/components/docs/users_guide/node319.html –

+0

Cóż, przeczytałem to podczas badania tego problemu i wypróbowałem wszystkie te : gcc -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -lglib-2.0 re.c -o ponownie gcc -lglib-2.0 - I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include re.c -o ponownie gcc -I/usr/include/glib-2.0 -I/usr /lib/x86_64-linux-gnu/glib-2.0/include re.c -o re -lglib-2.0 Nie sądzę, że zamówienie faktycznie coś zmienia. Pomyślałem, że flaga -lglib-2.0 powinna wskazywać na pliki .so - ale nie sądzę, że znajduje pliki .so. – lucidquiet

+0

Więc jakie było rozwiązanie, nie rozumiem? – user3728501

2
gcc -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include re.c -o re -lglib-2.0 

Uh - hell - Próbowałem tak wielu rzeczy i prawdopodobnie wszystko ich trochę skrzywdziło, ale spróbowałem powyższego właśnie teraz, i to zadziałało .... soooo rozwiązany.

+0

Czy to nie to, co napisałem? – hmjd

+0

To jest - dlatego przyjąłem twoją odpowiedź.Przypuszczam, że powinienem właśnie dodać komentarz do twojego postu. – lucidquiet

+0

Musisz kliknąć biały znacznik obok odpowiedzi, aby ją zaakceptować. – hmjd