0

当我编译并链接此代码以获取磁盘 uuid 时:

#include <stdio.h>
#include <stdlib.h>
#include <err.h>
#include <blkid/blkid.h>

int main (int argc, char *argv[]) {
  blkid_probe pr;
  const char *uuid;

  if (argc != 2) {
    fprintf(stderr, "Usage: %s devname\n", argv[0]);
    exit(1);
  }

  pr = blkid_new_probe_from_filename(argv[1]);
  if (!pr) {
    err(2, "Failed to open %s", argv[1]);
  }

  blkid_do_probe(pr);
  blkid_probe_lookup_value(pr, "UUID", &uuid, NULL);

  printf("UUID=%s\n", uuid);

  blkid_free_probe(pr);

  return 0;
}

它出错了:

/home/usr/blkid/blkid.c:15: undefined reference to `blkid_new_probe_from_filename'  
make[2]: Leaving directory `/home/usr/blkid'  
make[1]: Leaving directory `/home/usr/blkid'  
/home/usr/blkid/blkid.c:20: undefined reference to `blkid_do_probe'  
/home/usr/blkid/blkid.c:21: undefined reference to `blkid_probe_lookup_value'  
/home/usr/blkid/blkid.c:25: undefined reference to `blkid_free_probe'  

当我通过以下命令编译代码时,代码编译没有错误

gcc    -c -g -MMD -MP -MF build/Debug/GNU-Linux-x86/blkid.o.d -o build/Debug/GNU-Linux-x86/blkid.o blkid.c
4

2 回答 2

3

尝试放入-lblkid您的 gcc 命令,以便链接器知道您需要将代码链接到该库。请务必将此选项放在命令的末尾。选项的顺序在某种程度上很重要。从这里

在命令中编写此选项的位置有所不同;链接器按照指定的顺序搜索和处理库和目标文件。因此,“foo.o -lz bar.o”在文件 foo.o 之后但在 bar.o 之前搜索库“z”。如果 bar.o 引用 'z' 中的函数,则可能不会加载这些函数。

此命令应自动编译和链接您的源代码:

gcc -o test -g -MMD -MP -MF build/Debug/GNU-Linux-x86/blkid.o.d blkid.c -lblkid
于 2013-08-05T08:03:34.650 回答
2

您显示的错误来自链接器。

如果您将单个文件编译为.o没有链接的文件,则不会尝试执行任何外部引用。

但是,如果您想编译成可执行文件,则必须满足所有必需的要求。如果程序需要存在 a blkid_do_probe(),您应该以某种方式提供它。可能这将通过与适当的库链接来完成。正如有人在评论中提到的那样,这是用-lblkid.

于 2013-08-05T07:18:45.433 回答