Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
gnu对库中包含的函数进行C未定义引用_C_Makefile_Gnu Make_Undefined Reference - Fatal编程技术网

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

gnu对库中包含的函数进行C未定义引用,c,makefile,gnu-make,undefined-reference,C,Makefile,Gnu Make,Undefined Reference,更新:发现问题。这是我这边的一个错误,与make无关。我对文件进行了编辑,删除了预处理器,并把它弄糟了 我试图使用makefile编译一个测试程序,以处理文件库的创建,其中包括测试所使用的函数。在尝试生成最终可执行文件时,我收到一个“未定义引用”错误。下面是我的makefile和结果输出。我曾尝试在makefile中切换文件和操作的顺序,但都失败了。这让我相信,我缺少了一些关键的组件来让它工作,而不是需要重新安排我的操作 我正在运行RHEL 4,如果这很重要的话 CC=gcc CFLAGS=-W

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

您忘记链接对象文件
$(OBJ)
,并且可能不需要任何
$(LIB)
,因此请替换

$(PROG):
    $(CC) $(CFLAGS) $(LIB) -o $@

如果您确实想拥有您的库,您需要链接一个提供
main
的对象文件。可能保留
$(LIB)
,但从
OBJ
的定义中删除
test.o
,然后执行以下操作

$(PROG): test.o $(LIB)
     $(CC) $(CFLAGS) $^ -o $@
阅读
make

事实上,您应该升级您的Linux发行版(现在使用RHEL4是不合理的)。如果可能的话,在2015年,使用带有&
make 4的。。。也可以使用调试您的<代码>生成文件< /代码> -s。另请参见答案中的链接(包括short
Makefile
-s的示例)


顺便说一句,静态库通常是过时的,在您的情况下,可能不值得拥有一个库(甚至是共享库)。如果您真的想要一个,请将其共享,并阅读&Drepper的论文:

是否在
磁盘分配.c
中创建
磁盘分配.c
?你能在
磁盘alloc.o
文件和
libtest.a
库中看到这些符号吗?你也意识到RHEL 4非常古老,充满了巨大的安全漏洞,对吧?(在这一点上,这两个函数完全没有得到维护。)不考虑漏洞的说法,是的,这两个函数在disk_alloc.c中,并且在库中。@etan reisner查看disk_alloc.o文件时,我实际上发现disk_alloc_create和disk_alloc_delete的符号没有找到,但它们在库中。是什么导致这种差异?我如何解决它?当你说“它们在库中”时,你的意思是你可以在
libtest.a
文件中找到它们?还是在源头?如果他们在图书馆的话,我想一切都会好起来的。如果它们只在源代码中,那么它们要么没有标记为导出,要么gcc选择不将它们包含在目标文件中,原因我无法想象。它们可以在libtest.a文件中找到,但不在disk_alloc.o中。感谢您的快速回复。不幸的是,这会为库中找到的所有函数生成一堆“多定义”错误,并且仍然会在命令末尾留下“未定义引用”错误。我还可以提供其他信息吗?OP正在链接
libtest.a
库,因此不需要单独的对象文件。这个答案仍然无法解决由磁盘分配创建和磁盘分配删除引起的“未定义引用”错误。我已经删除了对库的引用,只使用了目标文件,并且只删除了test.o,并使用上面的建议分别编译了它。两者产生相同的结果。鉴于disk\u alloc\u create和disk\u alloc\u delete都没有在disk\u alloc.o文件中找到,这让我相信那里出了什么问题,但我不确定是什么问题。如果没有您正在编译的全部源代码,我们无法提供更多帮助。您应该在问题中提到这一点,当然不会在评论中提及
$(PROG): test.o $(LIB)
     $(CC) $(CFLAGS) $^ -o $@