gcc不能编译gdbm的程序

系统:Fedora10.0 

程序:beginning linux programming chapter7 dbm1.c

报错:/tmp/cc4T13wv.o: In function `main':

dbm1.c:(.text+0x2d): undefined reference to `dbm_open'

dbm1.c:(.text+0x250): undefined reference to `dbm_store'

dbm1.c:(.text+0x2fb): undefined reference to `dbm_fetch'

dbm1.c:(.text+0x38a): undefined reference to `dbm_close'

collect2: ld returned 1 exit status

 

程序源代码如下:

#include <unistd.h> #include <stdlib.h> #include <stdio.h> #include <fcntl.h> #include <ndbm.h> #include <string.h> #define TEST_DB_FILE "/tmp/dbm1_test" #define ITEMS_USED 3 /* A struct to use to test dbm */ struct test_data { char misc_chars[15]; int any_integer; char more_chars[21]; }; int main() { struct test_data items_to_store[ITEMS_USED]; struct test_data item_retrieved; char key_to_use[20]; int i, result; datum key_datum; datum data_datum; DBM *dbm_ptr; dbm_ptr = dbm_open(TEST_DB_FILE, O_RDWR | O_CREAT, 0666); if (!dbm_ptr) { fprintf(stderr, "Failed to open database/n"); exit(EXIT_FAILURE); } /* put some data in the structures */ memset(items_to_store, '/0', sizeof(items_to_store)); strcpy(items_to_store[0].misc_chars, "First!"); items_to_store[0].any_integer = 47; strcpy(items_to_store[0].more_chars, "foo"); strcpy(items_to_store[1].misc_chars, "bar"); items_to_store[1].any_integer = 13; strcpy(items_to_store[1].more_chars, "unlucky?"); strcpy(items_to_store[2].misc_chars, "Third"); items_to_store[2].any_integer = 3; strcpy(items_to_store[2].more_chars, "baz"); for (i = 0; i < ITEMS_USED; i++) { /* build a key to use */ sprintf(key_to_use, "%c%c%d", items_to_store[i].misc_chars[0], items_to_store[i].more_chars[0], items_to_store[i].any_integer); /* build the key datum strcture */ key_datum.dptr = (void *)key_to_use; key_datum.dsize = strlen(key_to_use); data_datum.dptr = (void *)&items_to_store[i]; data_datum.dsize = sizeof(struct test_data); result = dbm_store(dbm_ptr, key_datum, data_datum, DBM_REPLACE); if (result != 0) { fprintf(stderr, "dbm_store failed on key %s/n", key_to_use); exit(2); } } /* for */ /* now try and retrieve some data */ sprintf(key_to_use, "bu%d", 13); /* this is the key for the second item */ key_datum.dptr = key_to_use; key_datum.dsize = strlen(key_to_use); data_datum = dbm_fetch(dbm_ptr, key_datum); if (data_datum.dptr) { printf("Data retrieved/n"); memcpy(&item_retrieved, data_datum.dptr, data_datum.dsize); printf("Retrieved item - %s %d %s/n", item_retrieved.misc_chars, item_retrieved.any_integer, item_retrieved.more_chars); } else { printf("No data found for key %s/n", key_to_use); } dbm_close(dbm_ptr); exit(EXIT_SUCCESS); } 

 

编译的时候使用的编译命令如下,引入/usr/include/gdbm头文件搜索路径,链接库文件gdbm

gcc -o dbm1 -I/usr/include/gdbm dbm1.c -lgdbm

 

但是编译不通过,查看了头文件ndbm.h里面的内容没有错的的,命名有声明这个几个函数,然后百度之后找到答案,需要链接一个gdbm_compat库才可以。使用命令如下,编译成功。

gcc -o dbm1 -I/usr/include/gdbm dbm1.c -lgdbm -lgdbm_compat

你可能感兴趣的:(struct,gcc,File,Integer,Build,reference)