TiFlash 编译踩坑总结

在编译 TiFlash 时遇到了一些问题,在这里稍微总结一下。

P.S. 根据平台和环境的不同,差异可能很大,本文仅供参考。

开发环境:

  • OS: Ubuntu 18.04 LTS (Bionic Beaver)
  • Kernel: x86_64 Linux 4.15.0-112-generic

问题与解决办法

  1. CMake 版本过低

CMake 版本需要在 3.21.0 及以上。

  1. 编译时出现了因为 -Werror 选项导致 warning 变成了 error 使得编译失败。

原因:编译器版本使用不当。

解决办法:只能使用 gcc 7.x 与 clang 13+,这一点 README 中也有写,不能忽视。

  1. 提示标准库某方法已被删除导致编译失败。

原因与解决方法同上。

  1. 启动 TiFlash 因为 vector 中的 assert 失败导致 core dump。

原因:libc++ 与 libstdc++ 混用。可以使用 ldd 命令查看 binary 与 lib 文件的动态链接库依赖,查看是否存在混用情况。如果环境中存在 libstdc++ 库,在编译 tiflash-proxy 时会默认引入 libstdc++ 库。

解决办法:更新代码到这个PR的版本之后 https://github.com/pingcap/tiflash/pull/5281 。显式指定编译时的 stdlib,即:修改 contrib/tiflash-proxy-cmake/CMakeLists.txt 中的 CXXFLAGS: “CXXFLAGS=-fuse-ld=lld -w -stdlib=libc++”

  1. 编译raftstore-proxy的时候出现 error: linking with xxxxx/tiflash/build/contrib/tiflash-proxy-cmake/tiflash-linker failed: exit status: 1。由于 duplicate symbols 造成的链接失败。

原因:(询问大佬后得到的解答)c++ libX static link libA的话,libA不会被打包进libX里,但是rust会。rocksdb里手动在build.rs里print了一个crypto,导致rustc搜索到了system的直接bundle进去了。然后又指定依赖openssl-sys,最后导致了冲突。

解决办法:

1 Like

学习中 , :+1: