问题描述
- C++ berkeley db安装后编译链接的奇怪错误。
-
我在centos6.5上安装了berkeley db 6.1.6,是下源代码在本系统上重新编译安装的。库如下:
ll -rt /usr/local/lib
-rwxr-xr-x 1 root root 2141065 11月 14 19:46 libdb-6.1.so
-rw-r--r-- 1 root root 929 11月 14 19:46 libdb-6.1.la
-rw-r--r-- 1 root root 3250156 11月 14 19:50 libdb-6.1.a
-rw-r--r-- 1 root root 3250156 11月 14 19:50 libdb.a
lrwxrwxrwx 1 root root 12 11月 14 19:50 libdb.so -> libdb-6.1.so
lrwxrwxrwx 1 root root 12 11月 14 19:50 libdb-6.so -> libdb-6.1.so也运行了 ldconfig
用了document上的示例代码
#include <string.h> #include <db_cxx.h> using namespace std; #define DESCRIPTION_SIZE 199 int main(int argc,char ** argv) { char *description = "Grocery bill."; float money = 122.45; Db my_database(NULL, 0); Dbt key(&money, sizeof(float)); Dbt data(description, strlen(description) + 1); int ret = my_database.put(NULL, &key, &data, DB_NOOVERWRITE); if (ret == DB_KEYEXIST) { my_database.err(ret, "Put failed because key %f already exists",money); } }
然后编译
gcc般般是4.9.2
clang++ main.cc -ldb -lpthread -o test_d -DHAVE_CXX_STDHEADERS
编译成功, 但链接错误:
[root@10-180-92-207 bigdata]# clang++ main.cc -ldb -lpthread -o test_d -DHAVE_CXX_STDHEADERS
/tmp/main-660df3.o: In functionmain':
Db::Db(DbEnv*, unsigned int)'
main.cc:(.text+0x87): undefined reference to
main.cc:(.text+0x9f): undefined reference toDbt::Dbt(void*, unsigned int)'
Dbt::Dbt(void*, unsigned int)'
main.cc:(.text+0xd0): undefined reference to
main.cc:(.text+0xf9): undefined reference toDb::put(DbTxn*, Dbt*, Dbt*, unsigned int)'
Db::err(int, char const*, ...)'
main.cc:(.text+0x147): undefined reference to
main.cc:(.text+0x199): undefined reference toDbt::Dbt()'
Dbt::Dbt()'
main.cc:(.text+0x1aa): undefined reference to
main.cc:(.text+0x242): undefined reference toDb::get(DbTxn*, Dbt*, Dbt*, unsigned int)'
Dbt::~Dbt()'
main.cc:(.text+0x2ed): undefined reference to
main.cc:(.text+0x2fe): undefined reference toDbt::~Dbt()'
Dbt::~Dbt()'
main.cc:(.text+0x30f): undefined reference to
main.cc:(.text+0x320): undefined reference toDbt::~Dbt()'
Db::~Db()'
main.cc:(.text+0x331): undefined reference to
main.cc:(.text+0x36c): undefined reference toDbt::~Dbt()'
Dbt::~Dbt()'
main.cc:(.text+0x382): undefined reference to
main.cc:(.text+0x398): undefined reference toDbt::~Dbt()'
Dbt::~Dbt()'
main.cc:(.text+0x3ae): undefined reference to
main.cc:(.text+0x3c4): undefined reference to `Db::~Db()'
clang: error: linker command failed with exit code 1 (use -v to see invocation)这就和完全啊没装berkeleydb的库一样的报错信息。
但问题是就libdb一个库文件,我也装了,就在系统默认目录下,也ldconfig了,-ldb也用了,就算用-L再明确指一遍也不行。。。我在另一台ubuntu14.04的电脑上重复了以上操作还是一样的问题。
这是什么鬼?装多了开源库,第一次件berkeleydb这样让我摸不着头脑的。
解决方案
你编译器的目录设置或者环境路径是否正确
解决方案二:
就是berkeley的db 的lib库文件没有link成功,路径对吗。
解决方案三:
你编译器的目录设置或者环境路径是否正确