gnu对库中包含的函数进行C未定义引用

时间:2015-09-30 15:45:21

标签: c makefile gnu-make undefined-reference

更新:发现问题。这是我的一个错误,与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

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

中的automatic variables

事实上,你应该升级你的Linux发行版(现在使用RHEL4是不合理的)。如果可能,请在2015年使用GCC 5& make 4. ...考虑使用remake来调试Makefile - s。另请参阅this答案中的链接(包括简短Makefile - s)

的示例 BTW,静态库通常是过时的,在您的情况下,它可能不值得拥有一个库(甚至是共享库)。如果您真的想要一个,请将其分享,然后阅读Program-Library-HowTo& Drepper的论文:How to Write a Shared Library