Erros do vinculador ao compilar com glib…?

1

Estou tendo problemas para compilar um programa simples e simples contra o Ubunutu. Eu recebo esses erros. Eu posso obtê-lo para compilar, mas não ligar com o sinalizador -c. Que eu acredito que significa que eu tenho os cabeçalhos simplificados instalados, mas não está encontrando o código de objeto compartilhado. Veja também o arquivo abaixo.

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

# 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 sendo compilado:

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

Estranhamente, quando eu executo glib-config ele não gosta desse comando - embora eu não saiba como dizer ao bash ou fazer como usar apenas um sobre o outro quando ele reclama que gdlib-config está nesses 2 pacotes.

$> 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
    
por lucidquiet 01.04.2012 / 20:13

1 resposta

2

glib não é problema seu. Isto é:

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

O que ele está dizendo é que você está chamando uma função print_uppercase_words , mas não consegue encontrá-la.

E há um motivo. Olhe bem de perto. Há um erro de digitação:

void print_upppercase_words(const gchar *string)

Depois de corrigir isso, você ainda pode ter um problema porque está especificando as bibliotecas antes dos módulos que requerem essas bibliotecas. Em suma, seu comando deve ser escrito

gcc -o re re.o -lglib-2.0

para que -lglib-2.0 venha depois de re.o .

Então eu escreveria seu Makefile mais assim:

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

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

De fato, se você definir as variáveis certas, make irá descobrir tudo automaticamente.

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

re: re.o
    
por 01.04.2012 / 20:32