在编译 TiFlash 时遇到了一些问题,在这里稍微总结一下。
P.S. 根据平台和环境的不同,差异可能很大,本文仅供参考。
开发环境:
- OS: Ubuntu 18.04 LTS (Bionic Beaver)
- Kernel: x86_64 Linux 4.15.0-112-generic
问题与解决办法
- CMake 版本过低
CMake 版本需要在 3.21.0 及以上。
- 编译时出现了因为 -Werror 选项导致 warning 变成了 error 使得编译失败。
原因:编译器版本使用不当。
解决办法:只能使用 gcc 7.x 与 clang 13+,这一点 README 中也有写,不能忽视。
- 提示标准库某方法已被删除导致编译失败。
原因与解决方法同上。
- 启动 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++”
- 编译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,最后导致了冲突。
解决办法:
- 删除 libssl-dev 库(我的解决办法)。
- 编译TiFlash6.0中遇到tiflash_proxy不通过 (Asktug 上其他的解决办法)。