库中函数的“未定义的函数引用”错误

时间:2015-11-21 23:33:04

标签: c linux gcc compiler-errors

我正在尝试使用C的id3标签,所以我下载了mplib并安装了它。

我试图在mplib.h中调用此函数,其中__P是一个宏

extern id3_tag_list* mp_get_tag_list_from_file __P((const char* path));
写下来     example.c

int main() {
    char* pa = "R U MINE";
    id3_tag_list* list = mp_get_tag_list_from_file(pa);
    id3_tag *newTag = list->tag;
    printf("tag %d\n", newTag->version);
    return 0;
}

但是当我链接时,我收到一个错误:

example.o: In function `main':
example.c:(.text+0x27): undefined reference to `mp_get_tag_list_from_file'
collect2: error: ld returned 1 exit status
make: *** [example] Error 1

我的makefile看起来像这样

OBJECTS = example.o
target=example
misc=Makefile
cflags=-Wall -g -O0 -Werror -pedantic -std=c99

all: $(target)

$(target) : $(OBJECTS) $(misc)
    gcc $(cflags) -o $(target) $(OBJECTS)

clean:
    rm -f $(OBJECTS) $(target)

我在编译时遇到问题。我认为问题是我在将其链接到实际定义该函数的实际mplib.c文件时遇到问题,但我不确定如何完全执行此操作。我从http://mplib.sourceforge.net/获得了库,我使用'make'和'make install'安装了它。我应该在某个地方手动移动mplib.c文件吗?

1 个答案:

答案 0 :(得分:1)

如果您构建mplib 1.0.3,则会创建一个库libmp.a。因此,您需要在链接器命令行上指定-lmp,并且可能-L /where/you/installed/it/lib指定安装库的目录。

链接器命令行应该如下所示:

LDFLAGS = -L/usr/local/lib
LDLIBS  = -lmp

gcc $(cflags) -o $(target) $(OBJECTS) $(LDFLAGS) $(LDLIBS)

实际上,如果它看起来会更好:

$(CC) $(CFLAGS) -o $@ $(OBJECTS) $(LDFLAGS) $(LDLIBS)

大写宏CFLAGS用于C编译器的标志。 $@表示'当前目标的名称'。 LDFLAGS是链接器的标志,例如查找库的位置,LDLIBS包含库的规范。诸如-lmp之类的选项意味着“在搜索库的位置列表中的每个目录中查找libmp.solibmp.a(到足够接近的近似值)。 -L选项将以下目录添加到搜索库的位置列表前面。