当我编译并链接此代码以获取磁盘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
答案 0 :(得分:2)
您显示的错误来自链接器。
如果您在没有链接的情况下将一个文件编译为.o
文件,则不会尝试使用外部参考文件。
但是如果要编译成可执行文件,则必须满足所有必需的要求。如果程序需要blkid_do_probe()
的存在,您应该以某种方式提供它。可能这将通过链接到适当的库来完成。正如评论中提到的那样,这将通过-lblkid
完成。
答案 1 :(得分: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