我正在尝试使用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
文件吗?
答案 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.so
或libmp.a
(到足够接近的近似值)。 -L
选项将以下目录添加到搜索库的位置列表前面。