0

このコードをコンパイルしてリンクすると、ディスク 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
4

2 に答える 2

3

-lblkidコードをそのライブラリにリンクする必要があることをリンカが認識できるように、gcc コマンドに入力してみてください。このオプションは必ずコマンドの最後に付けてください。オプションの順序はどういうわけか重要です。ここから

コマンドのどこにこのオプションを記述するかによって違いが生じます。リンカーは、指定された順序でライブラリとオブジェクト ファイルを検索して処理します。したがって、'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
于 2013-08-05T08:03:34.650 に答える