如何在FreeBSD 9.1系统中使用libdb-4.2?

时间:2013-05-14 18:45:33

标签: c freebsd berkeley-db

我正在尝试在C中编写一个小程序,它将打开并从FreeBSD 9.1系统上的Berkeley 4.2哈希数据库中读取以进行测试,但我无法进行编译。这是我第一次用C编写任何东西并从命令行编译,所以我可能会遗漏一件让它工作的东西,我不知道。

在搜索完所有并查看github上的文档和源代码之后,这是我到目前为止所做的:

#include <sys/types.h>

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#include <unistd.h>

#include <db.h>

int main()
{                                                                 
  DB * mydb;                                                                
  u_int32_t open_flags = DB_RDONLY;
  int ret;

  ret = db_create(&mydb, NULL, 0);
  if (ret != 0) {
    printf("Error creating DB structure!");
    return 1;
  }

  ret = mydb->open(mydb, NULL, "bsddb-py", NULL, DB_HASH, open_flags, 0);
  if (ret != 0) {
    printf("Error opening DB file!");
    return 2;
  }

  mydb->close(mydb, 0);
}

我用这个编译:

cc -ldb-4.2 db_test.c

得到这个:

db_test.c: In function 'main':
db_test.c:20: error: 'DB_RDONLY' undeclared (first use in this function)
db_test.c:20: error: (Each undeclared identifier is reported only once
db_test.c:20: error: for each function it appears in.)
db_test.c:29: error: 'DB' has no member named 'open'
db_test.c:35: error: too many arguments to function 'mydb->close'

显然编译器挂了使用Berkeley 1.85(dbopen等)并且它不会让步吗?

2 个答案:

答案 0 :(得分:0)

DB_RDONLY包含在某些头文件中,而您不是#including。这应该照顾所有20行错误。

第29行:DB结构显然没有名为open的成员。重新检查结构/您可能忘记包含声明该结构的文件。

35:似乎函数close不带2个参数。在头文件中重新检查它/确保包含头文件。

答案 1 :(得分:0)

看起来#include <db.h>将为Berkeley 1.85提供一个接口,因为这是FreeBSD默认安装的。我们通过端口安装了Berkeley 4.2,并且为了避免冲突,与4.2接口的标头放在别处 - 我引用了正确的库而不是正确的标头。

所以,我将include更改为:

#include <db42/db.h>

...并用...编译

cc -I/usr/local/include/ -L/usr/local/lib/ -ldb-4.2 db_test.c -o db_test

运行带有该修改的上述源产生了无可见的输出,这意味着它有效!

作为新手,BSD很奇怪。