编译thrift外篇-关于默认链接包-(使用mapkeeper运行leveldb成功)
根据 https://stackoverflow.com/questions/9922949/how-to-print-the-ldlinker-search-path 使用
ldconfig -v 2>/dev/null | grep -v ^$'\t'
列出了所有的默认链接包路径,使用
ll /usr/local/cuda-8.0/lib64 /usr/lib/x86_64-linux-gnu/libfakeroot /usr/local/lib /lib/x86_64-linux-gnu /usr/lib/x86_64-linux-gnu /usr/lib/nvidia-375 /usr/lib32/nvidia-375 /lib32 /usr/lib32 /lib /usr/lib |grep
snappy
可以看到有snappy库。 查看leveldb时,有两个leveldb库,一个是apt-get安装的,一个是自己编译拷贝进去的,两个不一样大。现在想知道apt-get安装的路径在哪。
使用 ls -d -1 $PWD/**/* 这种方式以全路径方式列出当前目录下的文件,可以套用到上述路径,发现,snappy路径
/usr/lib/x86_64-linux-gnu/libsnappy.a
/usr/local/lib/libleveldb.a
leveldb路径
第一个是系统安装的。
通过fincore可知,链接的是/usr/local/lib/libleveldb.a ,也就是自己编译的。
最后,在Makefile里加上一句 LIB=/usr/lib/x86_64-linux-gnu/
以及 -L $(LIB)
竟然编译成功了!!!!
根据 http://blog.csdn.net/szyjsj/article/details/69567757 运行, ./mapkeeper_leveldb -d ./data
(1)端口是9090
(2)加了 -L $(LIB) 对于leveldb仍然链接的是/usr/local/lib/libleveldb.a
--修正,无法知道链接的是哪一个,似乎是apt-get安装的, remove以后编译就不成功了,即使在 -llibleveldb前加上 -L /usr/local/lib/ 也不行
然后重新apt-get install,编译成功了,但是清楚缓存后再编译,fincore发现两个地方的leveldb.a 都不在缓存中。
remove掉,或者重命名,将 -L /usr/local/lib -lleveldb 放在前面,编译成功。
于是,可以使用自己的 libleveldb.a 编译了。
(3)将 /usr/local/include/leveldb删除掉无法编译成功,提示头文件不存在。
(4) 运行 ./mapkeeper_leveldb -d ./data 后会打开 /usr/lib/x86_64-linux-gnu/libleveldb.so.1.18
这说明 so文件是运行时必须的。
后来又发现其实so文件并不需要,对其改名, ./mapkeeper_leveldb -d ./data 照样运行成功。
-rw-r--r-- 1 root root 816238 Nov 19 2015 /usr/lib/x86_64-linux-gnu/libleveldb.a.old
lrwxrwxrwx 1 root root 18 Nov 19 2015 /usr/lib/x86_64-linux-gnu/libleveldb.so.1 -> libleveldb.so.1.18
-rw-r--r-- 1 root root 367496 Nov 19 2015 /usr/lib/x86_64-linux-gnu/libleveldb.so.1.18
总结:
首先是要加入 -L /usr/lib/x86_64-linux-gnu/ 去除snappy的错误
要使用自己的libleveldb.a 必须在Makefile中将 -L /usr/local/lib -lleveldb 放在 -L /usr/lib/x86_64-linux-gnu/ -lboost_thread 的前面。
posted on 2017-08-25 20:07 longbigfish 阅读(194) 评论(0) 编辑 收藏 举报