Ошибка при использовании 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
,