Linkerfehler beim Kompilieren gegen glib...?

Linkerfehler beim Kompilieren gegen glib...?

Ich habe Probleme, ein einfaches Beispielprogramm mit glib auf Ubuntu zu kompilieren. Ich bekomme diese Fehler. Ich kann es kompilieren, aber nicht mit dem Flag -c verknüpfen. Das bedeutet meiner Meinung nach, dass ich die glib-Header installiert habe, aber der gemeinsam genutzte Objektcode nicht gefunden wird. Siehe auch die Make-Datei unten.

$> 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

Verwendetes Makefile:

# 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-Code wird kompiliert:

#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);
}

Seltsamerweise glib-configgefällt ihm dieser Befehl nicht, wenn ich ihn ausführe – allerdings weiß ich nicht, wie ich Bash oder Make sagen kann, dass sie einfach das eine statt des anderen verwenden sollen, wenn es sich beschwert, dass es gdlib-configin diesen beiden Paketen enthalten ist.

$> 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

Antwort1

glib ist nicht Ihr Problem. Das hier ist:

re.c:(.text+0xd6): undefined reference to `print_uppercase_words'

Es bedeutet, dass Sie eine Funktion aufrufen print_uppercase_words, diese aber nicht finden können.

Und dafür gibt es einen Grund. Schauen Sie genau hin. Da ist ein Tippfehler:

void print_upppercase_words(const gchar *string)

Nachdem Sie das behoben haben, liegt möglicherweise immer noch ein Problem vor, da Sie die Bibliotheken vor den Modulen angeben, die diese Bibliotheken benötigen. Kurz gesagt, Ihr Befehl sollte wie folgt geschrieben werden:

gcc -o re re.o -lglib-2.0

das -lglib-2.0kommt also danach re.o.

Daher würde ich Ihr Makefile eher so schreiben:

re.o: re.c
        $(CC) -I<includes> -o $@ -c $^

re: re.o
        $(CC) $^ -l<libraries> -o $@

Wenn Sie die richtigen Variablen festlegen, makewird das Ganze tatsächlich automatisch für Sie herausgefunden.

CFLAGS=$(shell pkg-config --cflags glib-2.0)
LDLIBS=$(shell pkg-config --libs glib-2.0)
CC=gcc

re: re.o

verwandte Informationen