1

テスト用に FreeBSD 9.1 システム上の Berkeley 4.2 ハッシュ DB を開いて読み取る小さなプログラムを C で作成しようとしていますが、コンパイルできません。Cで何かを書いてコマンドラインからコンパイルしたのはこれが初めてなので、おそらくそれを機能させるための何かが1つ欠けていると思います.

あらゆる場所を検索し、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 など) を使用することにハングアップしており、動きませんか?

4

2 に答える 2

0

#include <db.h>FreeBSD にデフォルトでインストールされているので、Berkeley 1.85 へのインターフェースを提供するようです。ポート経由でインストールされた 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は奇妙です。

于 2013-05-14T19:23:06.653 に答える