常见问题

更新代码后重新编译

如果通过git pull更新代码后,可能会出现编译失败的情况,这可能是因为:

  • 依赖的子模块发生了变化,需要更新子模块到合适的版本(通过git status可以看rdsn和rocksdb子模块是否发生变化);
  • 编译配置发生了变化,CMake文件已过期;
  • thirdparty依赖发生了变化,需要重新下载和编译依赖库;可以先尝试按照如下步骤是否能解决(解决子模块和编译配置发生变化的问题):
  1. git submodule update
  2. ./run.sh build -c

如果还不能解决,可以进一步尝试(解决thirdparty依赖变化的问题):

  1. ./run.sh build --clear_thirdparty

如果还不能解决,请咨询我们。

使用非系统自带的boost库

编译默认使用系统自带的boost库,但是如果系统自带的库版本太低且无法升级,可以自己下载和编译高版本的boost库,然后通过-b参数传进来:

  1. ./run.sh build -b /your/boost/installation/path

譬如:

  1. ./run.sh build -b /home/work/software/boost_1_58_0/output

使用toolchain编译

编译默认使用系统自带的gcc/g++,但是如果系统自带的编译器版本太低且无法升级(不支持C++11),可以自己下载和编译高版本的gcc toolchain,然后放到PATH中:

  1. export PATH="$TOOLCHAIN_DIR/bin:$PATH"
  2. ./run.sh build

运行时出现libstdc++版本不兼容问题

如果用户使用自己的(非系统自带的)gcc或者boost库,在运行时可能出现c++版本不兼容的错误:

  1. ./pegasus_server: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.14' not found (required by ./pegasus_server)
  2. ./pegasus_server: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.17' not found (required by ./pegasus_server)
  3. ./pegasus_server: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.19' not found (required by ./pegasus_server)
  4. ./pegasus_server: /usr/lib64/libstdc++.so.6: version `CXXABI_1.3.5' not found (required by ./pegasus_server)

此时最好使用pack工具打包成运行时的执行包:

  • pack_server:服务包,用于部署Pegasus集群的服务进程。注意在运行前需要:export LD_LIBRARY_PATH=$package_dir/DSN_ROOT/lib
  • pack_client:C++客户端库,用于业务开发。
  • pack_tools:工具包,run.sh里面大部分命令都能用,包括shell和onebox工具。以上三个pack工具都支持-b-g选项,将用户自己的boost和gcc库放到DSN_ROOT/lib中,避免运行时链接到错误的库。这样,即使跨机器,只要libc兼容,执行包都能正常使用,避免库不兼容的困扰。

如果你用了自己的gcc,就在pack的时候加上-g选项,譬如:

  1. ./run.sh pack_server -g

如果你用了自己的boost,就在pack的时候加上-b选项,譬如:

  1. ./run.sh pack_server -b

如果都用了,就同时加上-b-g选项,譬如:

  1. ./run.sh pack_server -b -g

指定gflags以编译bench工具

注:从1.10.0版本开始,Pegasus编译强制依赖gflags库,以下步骤可以忽略。

Pegasus的bench工具修改自RocksDB的bench,其在编译时需要依赖gflags,如果找不到gflags,虽然也能编译成功,但是bench程序无法使用,会报如下错误:

  1. Please install gflags to run rocksdb tools

默认使用系统库中自带的gflags,如果系统库中没有安装,可以自己下载和编译gflags库,然后放到以下环境变量中:

  1. export CPATH="$GFLAGS_DIR/include"
  2. export LIBRARY_PATH="$GFLAGS_DIR/lib"
  3. ./run.sh build