|
下面是一个从《Beginning Linux Programming 3rd》中的一个例子程序,但是在Archlinux下编译不了,我不知道具体什么原因。而gdbm是在base中的,所以完全安装了base中的包的系统都已经安装好了gdbm。希望大家帮忙一下!
- #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);
- }
复制代码
尝试编译1:
$gcc dbm1.c -o gdbm1 -lgdbm
错误信息:
/tmp/cc2vMknU.o: In function `main':
dbm1.c: (.text+0x2d): undefined reference to `dbm_open'
dbm1.c: (.text+0x244): undefined reference to `dbm_store'
dbm1.c: (.text+0x2ee): undefined reference to `dbm_fetch'
dbm1.c: (.text+0x379): undefined reference to `dbm_close'
collect2: ld returned 1 exit status
尝试编译2:
$ gcc dbm1.c -o gdbm1 -lndbm -L/usr/lib
错误信息:
/usr/bin/ld: cannot find -lndbm
collect2: ld returned 1 exit status
解决了:
如果用gdbm,还要兼容dbm或ndmb,编译的时候要连接上gdbm_compat:
$ gcc dbm1.c -o dbm1 -lgdbm -lgdbm_compat |
|