C & makefile: используя исходный файл с другим именем - PullRequest
1 голос
/ 04 марта 2012

Я довольно новичок в C и make-файлах и, таким образом, не полностью понимаю внутреннюю работу.В качестве задания для школы мне сказали сделать проверку орфографии, реализуя три различных способа.Нам дали набор файлов шаблонов для работы.

В основной файл (spell-checker.c) я включаю hash.h.Этот файл дает мне несколько прототипов функций.

Теперь у меня есть несколько исходных файлов - давайте назовем их hash-glib.c и hash-chain.c.Первый файл использует glib и поэтому должен включать эту библиотеку (отсюда и материал pkg-config).Мне удается скомпилировать и запустить hash-glib.c, используя следующие функции makefile:

%.o: %.c
    gcc $(CFLAGS) $< -c -o $@

hash-glib.o: hash-glib.c
    gcc $< -c `pkg-config --cflags glib-2.0` $(CFLAGS)

libhash-glib.a: hash-glib.o
    ar rcs libhash-glib.a $<

spell-checker-glib: spell-checker.c libhash-glib.a
    gcc spell-checker.c  -L. \
        -lhash-glib `pkg-config --cflags --libs glib-2.0` $(CFLAGS) -o $@

Я попытался добавить следующее, чтобы получить желаемый результат (безрезультатно):

libhash-chaining.a: hash-chaining.o
    ar rcs libhash-chaining.a $<

spell-checker-chaining: spell-checker.c libhash-glib.a
    gcc spell-checker.c -o $@ $(CFLAGS)

Что мне здесь не хватает?(и для дальнейшего использования - какие ключевые слова я мог бы изучить?)

Большое спасибо!

РЕДАКТИРОВАТЬ: Это вывод:

$ make spell-checker-glib
gcc hash-glib.c -c `pkg-config --cflags glib-2.0` -std=c99 -Wall -Wextra -pedantic -O2
ar rcs libhash-glib.a hash-glib.o
gcc spell-checker.c  -L. \
            -lhash-glib `pkg-config --cflags --libs glib-2.0` -std=c99 -Wall -Wextra -pedantic -O2 -o spell-checker-glib
$ make spell-checker-chaining
gcc spell-checker.c -o spell-checker-chaining -std=c99 -Wall -Wextra -pedantic -O2
Undefined symbols for architecture x86_64:
  "_hash_table_new", referenced from:
       _main in ccGPxFvR.o
  "_hash_table_insert", referenced from:
      _main in ccGPxFvR.o
 "_hash_table_fill", referenced from:
      _main in ccGPxFvR.o
 "_hash_table_size", referenced from:
      _main in ccGPxFvR.o
 "_hash_table_lookup", referenced from:
      _main in ccGPxFvR.o
 "_hash_table_destroy", referenced from:
      _main in ccGPxFvR.o
ld: symbol(s) not found for architecture x86_64
collect2: ld returned 1 exit status
make: *** [spell-checker-chaining] Error 1

1 Ответ

2 голосов
/ 04 марта 2012

Проблема здесь:

spell-checker-chaining: spell-checker.c libhash-glib.a
    gcc spell-checker.c -o $@ $(CFLAGS)

Компилирует spell-checker.c в spell-checker-chaining. Он требует, чтобы libhash-glib.a существовал, но не использовал его и вообще не упоминал hash-chaining, поэтому компилятор понятия не имеет, что он должен использовать для хеш-функций.

Я предлагаю вам попробовать следующее:

spell-checker.o: spell-checker.c
    # I'm kind of guessing here, I don't know what flags this object needs.
    gcc $<  `pkg-config --cflags` $(CFLAGS) -o $@

# I'm assuming spell-checker-chaining doesn't use glib.
spell-checker-chaining: spell-checker.o hash-chaining.o
    gcc $^ -o $@ $(CFLAGS)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...