更新:发现问题。这是我的一个错误,与make无关。我编辑了文件以删除预处理器条件并使其变得拙劣。
我正在尝试使用makefile编译测试程序来处理包含测试使用的函数的文件库的创建。在尝试制作最终的可执行文件时,我收到“未定义的引用”错误。下面是我的makefile和结果输出。我尝试在makefile中切换文件和操作的顺序,但它们都导致失败。这让我相信我错过了一些关键组件,使其无法重新排序我的操作。
如果重要的话,我正在运行RHEL 4.
CC=gcc
CFLAGS=-Wall
LDFLAGS=-lm
AR=ar
OBJ = \
test.o \
disk_alloc.o \
stringtools.o \
path.o \
xxmalloc.o
LIB = libtest.a
PROG = test
TAR = $(LIB) $(PROG)
all: $(TAR)
libtest.a: $(OBJ)
$(AR) -rv $(LIB) $(OBJ)
ranlib $(LIB)
$(PROG):
$(CC) $(CFLAGS) $(LIB) -o $@
clean:
rm -f $(OBJ) $(TAR)
.PHONY: all clean
# vim: set noexpandtab tabstop=4:
执行make后的输出:
gcc -Wall -c -o test.o test.c
gcc -Wall -c -o disk_alloc.o disk_alloc.c
gcc -Wall -c -o stringtools.o stringtools.c
gcc -Wall -c -o path.o path.c
gcc -Wall -c -o xxmalloc.o xxmalloc.c
ar -rv libtest.a test.o disk_alloc.o stringtools.o path.o xxmalloc.o
ar: creating libtest.a
a - test.o
a - disk_alloc.o
a - stringtools.o
a - path.o
a - xxmalloc.o
ranlib libtest.a
gcc -Wall libtest.a -o test
libtest.a(test.o): In function `disk_alloc_test_empty':
test.c:(.text+0x5f): undefined reference to `disk_alloc_create'
test.c:(.text+0x81): undefined reference to `disk_alloc_delete'
libtest.a(test.o): In function `disk_alloc_test_read_write':
test.c:(.text+0x17b): undefined reference to `disk_alloc_create'
test.c:(.text+0x1e0): undefined reference to `disk_alloc_delete'
libtest.a(test.o): In function `disk_alloc_test_nested':
test.c:(.text+0x30a): undefined reference to `disk_alloc_create'
test.c:(.text+0x372): undefined reference to `disk_alloc_create'
test.c:(.text+0x410): undefined reference to `disk_alloc_delete'
test.c:(.text+0x426): undefined reference to `disk_alloc_delete'
collect2: ld returned 1 exit status
make: *** [test] Error 1
答案 0 :(得分:2)
您忘记关联目标文件$(OBJ)
,可能不需要任何$(LIB)
,因此请替换
$(PROG):
$(CC) $(CFLAGS) $(LIB) -o $@
与
$(PROG): $(OBJ)
$(CC) $(CFLAGS) $^ -o $@
如果您想要拥有自己的库,则需要链接一个提供main
之外的目标文件。可能会保留$(LIB)
,但会从test.o
的定义中移除OBJ
,然后执行
$(PROG): test.o $(LIB)
$(CC) $(CFLAGS) $^ -o $@
详细了解make
事实上,你应该升级你的Linux发行版(现在使用RHEL4是不合理的)。如果可能,请在2015年使用GCC 5& make 4.
...考虑使用remake来调试Makefile
- s。另请参阅this答案中的链接(包括简短Makefile
- s)