¿Errores del vinculador al compilar contra simplista...?

¿Errores del vinculador al compilar contra simplista...?

Tengo problemas para compilar un programa de muestra simple contra simplista en Ubuntu. Recibo estos errores. Puedo hacer que se compile pero no se vincule con el indicador -c. Lo que creo que significa que tengo instalados los encabezados simplistas, pero no encuentro el código objeto compartido. Vea también el archivo make a continuación.

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

Archivo Make utilizado:

# 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ódigo .c que se está compilando:

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

Curiosamente, cuando lo ejecuto glib-configno me gusta ese comando, aunque no sé cómo decirle a bash o cómo usar uno sobre el otro cuando se queja de que gdlib-configestá en estos 2 paquetes.

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

Respuesta1

simplista no es tu problema. Esto es:

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

Lo que dice es que estás llamando a una función print_uppercase_words, pero no puede encontrarla.

Y hay una razón. Mira muy de cerca. Hay un error tipográfico:

void print_upppercase_words(const gchar *string)

Después de solucionar eso, es posible que aún tenga un problema porque está especificando las bibliotecas antes que los módulos que requieren esas bibliotecas. En resumen, su comando debe escribirse

gcc -o re re.o -lglib-2.0

entonces eso -lglib-2.0viene después re.o.

Entonces escribiría tu Makefile más así:

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

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

De hecho, si configura las variables correctas, makelo resolverá todo automáticamente.

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

re: re.o

información relacionada