2013-08-05 21 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

您是否嘗試在gcc中添加'-lblkid' –

回答

2

嘗試將-lblkid放入gcc命令,以便鏈接器知道您需要將您的代碼鏈接到該庫。一定要把這個選項放在命令的末尾。選項順序很重要。 From here

它在你寫這個選項的命令中有所不同, 鏈接器按指定的順序搜索並處理庫和目標文件,其順序爲 。因此,'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 
2

您顯示的錯誤來自鏈接器。

如果您將一個文件編譯爲.o文件而不進行鏈接,則不會嘗試執行外部引用。

但是,如果你想編譯成可執行文件,必須滿足所有必需的需求。如果程序需要存在blkid_do_probe(),則應該以某種方式提供它。可能這將通過與適當的圖書館聯繫來完成。正如有人在評論中提到的那樣,這是通過-lblkid完成的。