当我编译并链接此代码以获取磁盘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

最佳答案

尝试将-lblkid放入gcc命令中,以便链接器知道您需要将代码链接到该库。请确保将此选项置于命令末尾。期权的顺序在某种程度上很重要。From here
在命令中编写此选项的位置会有所不同;在
链接器按顺序搜索和处理库和对象文件
它们是指定的。因此,“foo.o-lz bar.o”在
文件foo.o但在bar.o之前。如果bar.o引用'z'中的函数,
这些函数可能无法加载。
此命令应自动编译并链接源代码:

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

关于c - 使用libblkid时出错,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18052295/

10-10 09:40