Ошибка при использовании libblkid

Когда я скомпилирую и свяжу этот код, чтобы получить диск 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

2 ответа

Решение

Попробуй поставить -lblkid в вашу команду gcc, чтобы компоновщик знал, что вам нужно связать свой код с этой библиотекой. Не забудьте поставить эту опцию в конце команды. Порядок опций как-то имеет значение. Отсюда:

Имеет значение, где в команде вы пишете эту опцию; компоновщик ищет и обрабатывает библиотеки и объектные файлы в указанном порядке. Таким образом, 'foo.o -lz bar.o' ищет библиотеку 'z' после файла 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

Ошибка, которую вы показываете, исходит от компоновщика.

Если вы скомпилируете один файл в .o файл без ссылки, никакие внешние ссылки не будут пытаться выполнить.

Но если вы хотите скомпилировать в исполняемый файл, все необходимые требования должны быть выполнены. Если программа требует наличия blkid_do_probe(), вы должны предоставить это как-то. Вероятно, это будет сделано путем связывания с соответствующей библиотекой. Как кто-то упомянул в комментарии, это должно быть сделано с -lblkid,

Другие вопросы по тегам