我遇到了一个问题,无法使我的makefile正常工作而没有错误。我遇到的第一个问题是未定义对主函数的引用。在我的producer.c文件中,我已经将main作为一个函数声明了。第二个问题是未定义对SearchCustomer()的引用。
错误:
bash-4.1$ make
gcc -Wall -c producer.c shared.h
gcc -Wall -c consumer.c shared.h
gcc -Wall -c AddRemove.c shared.h
gcc -pthread -Wall -o producer.o consumer.o AddRemove.o
/usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../../lib64/crt1.o: In function `_start':
(.text+0x20): undefined reference to `main'
AddRemove.o: In function `AddRemove':
AddRemove.c:(.text+0xb1): undefined reference to `SearchCustomer'
AddRemove.c:(.text+0x1e9): undefined reference to `SearchCustomer'
AddRemove.c:(.text+0x351): undefined reference to `SearchCustomer'
collect2: ld returned 1 exit status
make: *** [producer] Error 1
makefile:
COMPILER = gcc
CCFLAGS = -Wall
all: main
debug:
make DEBUG=TRUE
main: producer.o consumer.o AddRemove.o
$(COMPILER) -pthread $(CCFLAGS) -o producer.o consumer.o AddRemove.o
producer.o: producer.c shared.h
$(COMPILER) $(CCFLAGS) -c producer.c shared.h
consumer.o: consumer.c shared.h
$(COMPILER) $(CCFLAGS) -c consumer.c shared.h
AddRemove.o: AddRemove.c shared.h
$(COMPILER) $(CCFLAGS) -c AddRemove.c shared.h
ifeq ($(DEBUG), TRUE)
CCFLAGS += -g
endif
clean:
rm -f *.o
main
规则中,您可以编写:$(COMPILER) -o $@ $^ $(LDFLAGS)
并将-pthread
放入LDFLAGS
。在其他规则中,您可以编写一次:%.o: %.c
并作为配方:$(COMPILER) $(CCFLAGS) -c -o $@ $<
(不要将.h
文件交给编译器!)然后为特殊目标添加依赖项,例如:producer.o: shared.h other_header.h
和consumer.o: shared.h yet_another_header.h
等。 - Shahbaz$(MAKE)
而不是仅使用make
以保留调用make的命令行标志。您可能还想使用--no-print-directory
来防止输出几行无用的内容。此外,对于C语言,请使用CFLAGS
(而不是可能被误认为是C ++的CCFLAGS
)。 - Shahbaz.PHONY: all clean debug
和其他目标,这些目标实际上并不是文件,让make
知道它不应该期望从配方中得到一个实际的文件。你也可以使用@$(MAKE) DEBUG=TRUE
(添加@
)来防止 make 回显命令。 - Shahbaz