我有一个这样的项目结构:
mcts/
src/
node_queue.c
node_queue.h
tests/
munit.c # testing frame work
munit.h
list_test.c # includes node_queue.h and munit.h
Makefile # Makefile in question
因此,我的目标是编译测试mcts / test / list_test.c。我已经阅读了几种不同的策略来做到这一点。在阅读了一些内容之后,我将我从Makefiles中获得的一些内容进行了调整:
CC= gcc
SOURCE= $(wildcard ../src/*.c ./*.c)
OBJECTS= $(patsubst %.c, %.o, $(SOURCE))
INCLUDE= -I. -I../src/
CFLAGS= -std=c11 -g $(INCLUDE) -Werror -Wall
list_test: list_test.o munit.o ../src/node_queue.o
$(CC) $(CFLAGS) $(INCLUDE) -o $@ list_test.o munit.o ../src/node_queue.o
.c.o:
$(CC) $(CFLAGS) -c $< -o $@
在
make
中调用mcts/tests
时,这是我最接近工作2个小时的错误:list_test.o: In function `construct_test':
/home/----/mcts/tests/list_test.c:9: undefined reference to `construct'
collect2: error: ld returned 1 exit status
make: *** [Makefile:8: list_test] Error 1
mcts/src/node_queue.h
中定义了构造的位置。$(INCLUDE)
是否不应该确保包含标头?我如何使它起作用?
非常感谢!
最佳答案
对于您的实际错误,您报告的是指向未定义符号的链接错误。如果该名称的对象或函数是在node_queue.h
中定义的,则您将得到construct
的多定义错误。
您可能缺少的是在该标头中有一个声明,但在node_queue.c
中没有定义。
关于c - 使用GNU make跨不同目录进行编译,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38746018/