美文网首页
pika编译笔记

pika编译笔记

作者: QxQx | 来源:发表于2022-02-12 14:28 被阅读0次

pika 是啥懂得都懂,如果你不知道,这篇文章对你也没有任何帮助

这篇文章已经同步到 pika 的 github中

pika issue

编译 pika

0 准备

需要软件 centos7.x gcc4.8 g++4.8 git cmake
最好用centos7系列, 在别的系统中编译可能会报错, 人生苦短, 别和自己过不去

使用make 编译的时候, 使用 make -jN (N=cpu核数 加快编译速度)


1 安装工具

  1. gcc g++ git 一般用 yum 安装

  2. 安装cmake

    cmake 源码 https://cmake.org/download/

    cmake依赖 openssl-devel 先用yum安装 openssl-devel
    yum install openssl openssl-devel

    编译安装cmake

    解压cmake源码

    ./bootstrap

    make && make install


2 解决rocksdb依赖,安装必备的库

rocksdb 依赖库

snappy gflags zlib bzip2 stdc++ lz4 zstd lzma 这些库都要安装 为了能静态编译,这些库都要安装静态库

  1. 编译snappy

    mkdir build && cd build

    编译 动态库
    cmake -DSNAPPY_BUILD_BENCHMARKS=OFF -DSNAPPY_BUILD_TESTS=OFF -DBUILD_SHARED_LIBS=ON ..

    make && make install

    编译 静态库
    cmake -DSNAPPY_BUILD_BENCHMARKS=OFF -DSNAPPY_BUILD_TESTS=OFF -DBUILD_SHARED_LIBS=OFF ..

    make && make install

    我没有找到同时编译动态库和静态库的方法,只能分开编译了

  2. 编译gflags

    ./configure

    make && make install

  3. 编译zlib

    ./configure

    make && make install

  4. bzip2 一般linux都自带, 没有的用 yum 安装一个

    yum install bzip2-devel bzip2-libs

  5. stdc++ 这个库需要安装静态库,直接 yum 安装

    yum install libstdc++ libstdc++-devel libstdc++-static

  1. 安装lz4

    解压,进入 源码目录

    cd build/cmake
    
    mkdir build && build
    
    cmake -DBUILD_STATIC_LIBS=ON -DLZ4_BUILD_CLI=OFF -DLZ4_BUILD_LEGACY_LZ4C=OFF CMAKE_BUILD_TYPE=Relase -D LZ4_POSITION_INDEPENDENT_LIB=OFF ..
    
    make && make install
    
  1. 安装 zstd

    解压源码

    cd build/cmake/lib

    make && make install

  2. 安装lzma

    解压源码 xz压缩包

    ./configure --disable-xz --disable-xzdec --disable-lzmadec --disable-lzmainfo --disable-lzma-links --disable-scripts  --disable-doc
    make && make install
    

最后, 所有的库都安装好后,把库加到 ld 目录中。因为有的库会安装到 /usr/local/lib64 目录下,但是有的系统没有把这个目录加到动态库搜索目录中,

解决办法

echo "/usr/local/lib64" >> /etc/ld.so.conf.d/usr.local.conf
echo "/usr/local/lib" >> /etc/ld.so.conf.d/usr.local.conf

执行 ldconfig


安装 protobuf

编译 protobuf, 用cmake编译 protobuf release 地址 https://github.com/protocolbuffers/protobuf/releases
下载 protobuf-cpp-XX.XX.XX.tar.gz

xx.XX.XX 是版本号需要下载3.X版本的

./configure

make && make install

protobuf 也要安装静态库

到这 protobuf 安装完成


3 拉代码

拉 pika 代码 github https://github.com/OpenAtomFoundation/pika
这里最好通过代理去拉代码,要不然 速度感人

  1. git 设置代理
git config --global https.proxy http://127.0.0.1:1080

git config --global https.proxy https://127.0.0.1:1080

git config --global --unset http.proxy

git config --global --unset https.proxy
  1. 拉取 依赖库代码

cd pika 源码目录

git submodule init
git submodule update


4 编译

预先编译

预先编译一次 glogrocksdb, 因为这两个库直接用 pika 的 MakeFile 编译容易出问题,先预编译一下

  1. 先特殊编译一下glog库
cd /third/glog
./configu
make && make install
  1. 编译rocksdb

rocksdb编译完不需要安装,只需要复制一下静态库就好

使用cmake构建

cmake 需要 cmake3, cmake命令如下

cmake -DWITH_BZ2=ON -DWITH_MD_LIBRARY=OFF -DWITH_SNAPPY=ON -DWITH_ZLIB=ON -DWITH_ZSTD=ON -DWITH_TOOLS=OFF -DWITH_TESTS=OFF -DCMAKE_BUILD_TYPE=Release ..

make -jN

把编译后的 librocksdb.a 复制到 rocksdb 的根目录

正常编译

按照官方给的文档编译即可,

执行 make

等待拉各个依赖模块的代码 然后自动编译

前期工作做好,编译中应该不会出错

检查编译是否正确

后续

编译完成后,这个可执行文件有很多 .so的依赖, 可移植比较差, 通过 脚本编译一个依赖较少的.so文件

执行 link_3_3_path-master.sh 脚本等待完成链接


编译完成

  1. 正常编译

    output/bin/ 目录中, 执行 ldd pika 如果没有 notfind 的依赖库 说明编译完成了

  2. 静态链接
    output/bin/ 目录中的是正常编译的, link_3_3_path-master.sh 同级目录下的是静态链接的

静态链接脚本

#!/usr/bin/sh
source_path=/root
dependence_path=/root/pika_static
g++ \
  ${source_path}/pika/src/build_version.o \
  ${source_path}/pika/src/pika_stable_log.o \
  ${source_path}/pika/src/pika_consensus.o \
  ${source_path}/pika/src/pika_slave_node.o \
  ${source_path}/pika/src/pika_statistic.o \
  ${source_path}/pika/src/pika_client_processor.o \
  ${source_path}/pika/src/pika_admin.o \
  ${source_path}/pika/src/pika_binlog.o \
  ${source_path}/pika/src/pika_bit.o \
  ${source_path}/pika/src/pika.o \
  ${source_path}/pika/src/pika_proxy.o \
  ${source_path}/pika/src/pika_proxy_cli.o \
  ${source_path}/pika/src/pika_proxy_conn.o \
  ${source_path}/pika/src/pika_client_conn.o \
  ${source_path}/pika/src/pika_command.o \
  ${source_path}/pika/src/pika_pubsub.o \
  ${source_path}/pika/src/pika_conf.o \
  ${source_path}/pika/src/pika_dispatch_thread.o \
  ${source_path}/pika/src/pika_hash.o \
  ${source_path}/pika/src/pika_hyperloglog.o \
  ${source_path}/pika/src/pika_kv.o \
  ${source_path}/pika/src/pika_list.o \
  ${source_path}/pika/src/pika_monitor_thread.o \
  ${source_path}/pika/src/pika_server.o \
  ${source_path}/pika/src/pika_set.o \
  ${source_path}/pika/src/pika_geo.o \
  ${source_path}/pika/src/pika_geohash.o \
  ${source_path}/pika/src/pika_geohash_helper.o \
  ${source_path}/pika/src/pika_binlog_transverter.o \
  ${source_path}/pika/src/pika_binlog_reader.o \
  ${source_path}/pika/src/pika_partition.o \
  ${source_path}/pika/src/pika_repl_bgworker.o \
  ${source_path}/pika/src/pika_repl_client.o \
  ${source_path}/pika/src/pika_repl_client_conn.o \
  ${source_path}/pika/src/pika_repl_client_thread.o \
  ${source_path}/pika/src/pika_repl_server.o \
  ${source_path}/pika/src/pika_repl_server_conn.o \
  ${source_path}/pika/src/pika_repl_server_thread.o \
  ${source_path}/pika/src/pika_cmd_table_manager.o \
  ${source_path}/pika/src/pika_auxiliary_thread.o \
  ${source_path}/pika/src/pika_rm.o \
  ${source_path}/pika/src/pika_table.o \
  ${source_path}/pika/src/pika_rsync_service.o \
  ${source_path}/pika/src/pika_inner_message.pb.o \
  ${source_path}/pika/src/pika_slot.o \
  ${source_path}/pika/src/pika_data_distribution.o \
  ${source_path}/pika/src/pika_meta.o \
  ${source_path}/pika/src/pika_cluster.o \
  ${source_path}/pika/third/slash/slash/lib/libslash.a \
  ${source_path}/pika/third/pink/pink/lib/libpink.a \
  ${source_path}/pika/third/blackwidow/lib/libblackwidow.a \
  ${source_path}/pika/third/rocksdb/librocksdb.a \
  ${source_path}/pika/src/pika_zset.o -static-libstdc++ -Wl,-Bstatic -lprotobuf -llz4 -lzstd -llz4 -lglog -lgflags -llzma -lsnappy -Wl,-Bdynamic -lpthread -lrt -lz -lbz2 -Wl,--dynamic-linker=/lib64/ld-linux-x86-64.so.2 -o pika 

-Wl,-Bstatic 后面的是要 静态链接 的库

-Wl,-Bdynamic 后面的是要 动态链 接的库

相关文章

  • pika编译笔记

    pika 是啥懂得都懂,如果你不知道,这篇文章对你也没有任何帮助 这篇文章已经同步到 pika 的 github中...

  • PIKA PIKA PIKA PIKA

    大家好,我是菜鸟小白菌。 今天给大家推荐的电影是大侦探皮卡丘。PIKA-PIKA, PIKA PIKA PIKAP...

  • pika_to_redis数据迁移工具设计与实现过程

    背景 为满足运维人员对于pika可以更好地运维,需要方便地将数据从pika迁移到redis,在pika系统中之前已...

  • Python3 操作RabbitMQ

    python使用pika模块操作RabbitMQ,我们可以通过sudo pip3 install pika来安装p...

  • pika

    本次分享主题 pika 是360 DBA和基础架构组联合开发的类redis 存储系统, 完全支持Redis协议,用...

  • RabbitMQ学习笔记(五)

    远程调用(RPC) ps: 使用pika以前的笔记中,已经知道如何使用工作队列,在多个工作者Worker中分发耗时...

  • pika支持codis的slot迁移

    概述 pika使用redis协议,命令操作和redis一致,因而可以直接使用codis作为pika的集群解决方案,...

  • pika 链接问题

    使用celery结合pika处理异步任务,并将处理任务结果发布到其他队列中时遇到错误获取pika 链接 过一段时间...

  • pika中锁的应用

    参考代码:pika-2.4.0pika作为类redis的存储系统,为了弥补在性能上的不足,在整个系统中大量使用多线...

  • 2015.10.25 To pika

    今天午睡时梦见比卡发信息给我 问我上次在车上跟我表白的陌生的男子还骚扰我吗 还发了一张图片还是链接过来 我还心里奇...

网友评论

      本文标题:pika编译笔记

      本文链接:https://www.haomeiwen.com/subject/eywtlrtx.html