这是我的Makefile,目标只是编译一组测试文件,并将它们与另一个名为tap.c
的文件链接起来,该文件包含我的测试函数.
SRCS = $(wildcard *.c)
OBJS = $(SRCS:.c=.o)
EXES = $(filter-out tap,$(basename $(SRCS)))
all: $(EXES)
%: %.o tap.o
gcc -o $@ $^
%.o: %.c
gcc -c $<
tap.o: tap.c tap.h
gcc -c $<
clean:
rm -f $(OBJS)
fclean: clean
rm -f $(EXES)
这是非常基本的.
.
├── isalnum.c
├── isalpha.c
├── isascii.c
├── isdigit.c
├── isprint.c
├── Makefile
├── tap.c
└── tap.h
1 directory, 8 files
问题是当我try 运行make
时,我得到一个链接器错误.
cc isalnum.c -o isalnum
/usr/bin/ld: /tmp/ccnuuKzZ.o: in function `main':
isalnum.c:(.text+0x14): undefined reference to `tap_plan'
/usr/bin/ld: isalnum.c:(.text+0x4a): undefined reference to `ok_at_loc'
/usr/bin/ld: isalnum.c:(.text+0x80): undefined reference to `ok_at_loc'
/usr/bin/ld: isalnum.c:(.text+0xb8): undefined reference to `ok_at_loc'
/usr/bin/ld: isalnum.c:(.text+0xf0): undefined reference to `ok_at_loc'
/usr/bin/ld: isalnum.c:(.text+0x128): undefined reference to `ok_at_loc'
/usr/bin/ld: /tmp/ccnuuKzZ.o:isalnum.c:(.text+0x160): more undefined references to `ok_at_loc' follow
/usr/bin/ld: /tmp/ccnuuKzZ.o: in function `main':
isalnum.c:(.text+0x3d9): undefined reference to `exit_status'
collect2: error: ld returned 1 exit status
make: *** [<builtin>: isalnum] Error 1
我的tap.c
文件包含所有这些符号,构建目标的规则似乎被绕过了,因为执行的cc
命令与我在Makefile中定义的规则不同.
果然,在一些研究之后,我发现当我使用make -r
时,一切似乎都正常工作.
gcc -c tap.c
gcc -c isalnum.c
gcc -o isalnum isalnum.o tap.o
gcc -c isalpha.c
gcc -o isalpha isalpha.o tap.o
gcc -c isascii.c
gcc -o isascii isascii.o tap.o
gcc -c isdigit.c
gcc -o isdigit isdigit.o tap.o
gcc -c isprint.c
gcc -o isprint isprint.o tap.o
rm isascii.o isprint.o isalnum.o isdigit.o isalpha.o
这是怎么回事?请告诉我我的工作流出了什么问题,我肯定遗漏了一些关于Makefile、链接和编译的关键内容.我希望我最初的Makefile能够毫无困难地工作.