C& makefile:使用其他名称的源文件

时间:2012-03-04 17:39:54

标签: c gcc makefile

我对C和makefile很新,因此不完全理解内部工作原理。作为一个学校的任务,我被告知要做一个拼写检查,实现三种不同的方式。我们获得了一组模板文件可供使用。

在主文件(spell-checker.c)中,我包含hash.h。这个文件给了我一些函数原型。

我现在有一些源文件 - 让我们称之为hash-glib.chash-chain.c。第一个文件使用glib,因此需要包含该库(因此pkg-config的东西)。我可以使用以下makefile函数编译并运行hash-glib.c

%.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 个答案:

答案 0 :(得分:2)

问题在于:

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)