0%

pika编译笔记

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

  6. 安装lz4

    解压,进入 源码目录

    1
    2
    3
    4
    5
    6
    7
    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
  7. 安装 zstd

    解压源码

    cd build/cmake/lib

    make && make install

  8. 安装lzma

    解压源码 xz压缩包

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

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

解决办法

1
2
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 设置代理
1
2
3
4
5
6
7
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库
1
2
3
cd /third/glog
./configu
make && make install
  1. 编译rocksdb

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

使用cmake构建

cmake 需要 cmake3, cmake命令如下

1
2
3
cmake笔记3 -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 同级目录下的是静态链接的

静态链接脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#!/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 后面的是要 动态链 接的库