如何在 FreeBSD 9.1 系统中使用 libdb-4.2?
Posted
技术标签:
【中文标题】如何在 FreeBSD 9.1 系统中使用 libdb-4.2?【英文标题】:How do I use libdb-4.2 in a FreeBSD 9.1 system? 【发布时间】:2013-05-14 18:45:32 【问题描述】:我正在尝试用 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 等)并且不会让步?
【问题讨论】:
【参考方案1】:看起来#include <db.h>
将提供一个到 Berkeley 1.85 的接口,因为这是默认安装在 FreeBSD 上的。我们通过端口安装了 Berkeley 4.2,为了避免冲突,与 4.2 接口的头文件放在了别处——我引用了正确的库,但没有引用正确的头文件。
所以,我将包含更改为:
#include <db42/db.h>
...并用...编译
cc -I/usr/local/include/ -L/usr/local/lib/ -ldb-4.2 db_test.c -o db_test
使用该修改运行上述源没有产生可见的输出,这意味着它有效!
作为一个新手,BSD 很奇怪。
【讨论】:
【参考方案2】:DB_RDONLY 包含在您未#include 的某些头文件中。这应该会处理所有第 20 行错误。
第 29 行:一个 DB 结构显然没有名为 open 的成员。重新检查结构/也许您忘记包含声明该结构的文件。
35: 似乎函数 close 不接受 2 个参数。在头文件中重新检查/确保包含头文件。
【讨论】:
Oracle's docs 和我在 github 上查看的示例代码(here 和 here)包括上述文件,仅此而已。 如果您的库没有安装到默认搜索路径,那么它应该读取 #include "db.h" 如果它在您的根目录中(与包含它的文件在同一目录中。否则,把文件的全路径如#include "this/is/where/it/is/db.h" 我尝试使用的库的完整路径是/usr/local/lib/libdb-4.2.so
,当我使用-ldb-4.2
指定库时,cc
发现库没有问题。我知道没有实际的.h
文件,但我看到的所有示例都指向#include <db.h>
。
我相信它应该是 -llibdb-4.2。试试看。抱歉,不知道您使用的是共享库。该库可能不是必需的。此外,您必须将 /usr/local/lib/ 添加到您的 ld_library 路径,以便它在那里搜索 .so 文件。这可能是问题所在。
不,-l
开关自动知道查找以“lib”开头的文件。我没有收到关于找不到库的错误,所以我确定开关是正确的。以上是关于如何在 FreeBSD 9.1 系统中使用 libdb-4.2?的主要内容,如果未能解决你的问题,请参考以下文章