在我的头文件中调用方法时,我无法弄清楚为什么我得到一个未定义的引用问题

时间:2015-12-05 03:42:33

标签: c linux undefined

当我调用我的其他文件(memalloc.c)标题中定义的方法时,我的测试文件(memalloc_test.c)中出现以下错误......

gcc memalloc_test.c -o memalloc_test
/tmp/ccvO6oS7.o: In function `main':
memalloc_test.c:(.text+0x1f): undefined reference to `my_mallinfo'
memalloc_test.c:(.text+0x29): undefined reference to `my_malloc'
memalloc_test.c:(.text+0x4d): undefined reference to `my_mallinfo'
memalloc_test.c:(.text+0x6d): undefined reference to `my_free'
memalloc_test.c:(.text+0x81): undefined reference to `my_mallinfo'
memalloc_test.c:(.text+0x9f): undefined reference to `my_malloc'
memalloc_test.c:(.text+0xc8): undefined reference to `my_mallinfo'
memalloc_test.c:(.text+0xd4): undefined reference to `my_free'
memalloc_test.c:(.text+0xe0): undefined reference to `my_free'
memalloc_test.c:(.text+0xf4): undefined reference to `my_mallinfo'
memalloc_test.c:(.text+0x100): undefined reference to `my_free'
memalloc_test.c:(.text+0x10c): undefined reference to `my_free'
memalloc_test.c:(.text+0x120): undefined reference to `my_mallinfo'
memalloc_test.c:(.text+0x12a): undefined reference to `my_malloc'
memalloc_test.c:(.text+0x142): undefined reference to `my_mallinfo'
memalloc_test.c:(.text+0x14e): undefined reference to `my_free'
memalloc_test.c:(.text+0x162): undefined reference to `my_mallinfo'
memalloc_test.c:(.text+0x16c): undefined reference to `my_mallopt'
memalloc_test.c:(.text+0x176): undefined reference to `my_malloc'
memalloc_test.c:(.text+0x18e): undefined reference to `my_mallinfo'
memalloc_test.c:(.text+0x198): undefined reference to `my_malloc'
memalloc_test.c:(.text+0x1b0): undefined reference to `my_mallinfo'
memalloc_test.c:(.text+0x1bc): undefined reference to `my_free'
memalloc_test.c:(.text+0x1d0): undefined reference to `my_mallinfo'
collect2: error: ld returned 1 exit status

我的头文件如下......

//Header    
#ifndef MEMALLOC_H
#define MEMALLOC_H

#define BLOCK_SIZE 500
#define NUMBER_POINTERS 10

void* my_malloc(int size);
void my_free(void *ptr);
void my_mallopt(int policy);
void my_mallinfo();
extern char *my_malloc_error();

#endif

我非常确定我的标题是在“memalloc.c”中调用正确命名的方法。目前我的make文件汇编了memalloc,但我手动尝试编译测试,这是我失败的地方。如果它是相关的,这是我的make文件。

CFLAGS = -c -Wall
CFLAGS+= -g
LDFLAGS = 
SOURCES= memalloc.c memalloc_test.c memalloc.h
OBJECTS=$(SOURCES:.c=.o)
EXECUTABLE=memalloc
all: $(SOURCES) $(EXECUTABLE)
$(EXECUTABLE): $(OBJECTS)
    gcc $(OBJECTS) $(LDFLAGS) -o $@
.c.o:
    gcc $(CFLAGS) $< -o $@
clean:
    rm -rf *.o *~ memalloc

2 个答案:

答案 0 :(得分:2)

据我所知:

gcc memalloc_test.c -o memalloc_test

这一行是将memalloc_test.c编译成一个目标文件,但没有添加memalloc.c的目标文件,这是对这些函数的引用的定义。

答案 1 :(得分:2)

链接程序时,必须在gcc调用时指定所有相关的目标文件(如果需要,还可以指定库)。但是,在此命令行中,您只指定了一个:

gcc memalloc_test.c -o memalloc_test

你的makefile几乎可以正常工作,但你应该删除SOURCES行中的头文件,这样看起来像这样:

SOURCES= memalloc.c memalloc_test.c

然后OBJECTS被分配memalloc.o memalloc_test.o并且gcc命令将被替换(在替换变量之后):

gcc memalloc.o memalloc_test.o -o memalloc

进一步说明:您可以将可执行文件名称更改为memalloc_test