我对C和makefile很新,因此不完全理解内部工作原理。作为一个学校的任务,我被告知要做一个拼写检查,实现三种不同的方式。我们获得了一组模板文件可供使用。
在主文件(spell-checker.c
)中,我包含hash.h
。这个文件给了我一些函数原型。
我现在有一些源文件 - 让我们称之为hash-glib.c
和hash-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
答案 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)