2013-08-05 1 views
0

, когда я скомпилировать и скомпоновать этот код, чтобы получить диск UUID:ошибка с использованием libblkid

#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 
+0

Как вы собираете, что это не получится? –

+2

Вы пытались добавить '-lblkid' в gcc –

ответ

2

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

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

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

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

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