您的位置:首页 > 其它

编译thrift外篇-关于默认链接包-(使用mapkeeper运行leveldb成功)

2017-08-25 20:07 260 查看
根据 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 的前面。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐