最近在调研 Redpanda,并且尝试将它移动到公司的内网环境下编译,中间踩了不少坑。Redpanda 对新工具新特性的使用上相对激进,而它提供的编译脚本并没有考虑到 C++ 编译环境的复杂性。我在 Ubuntu 23.10 环境下经过“简单”适配最终可以顺利编译完成,但在 Ubuntu 22.04 LTS 下却始终会产生一个 static_assert 静态检查错误。两个系统版本中均使用同一个版本的 clang-16,最终只有一个能编译成功,十分令人困惑。
抛开依赖包的版本不看,Ubuntu 22.04 与 Ubuntu 23.10 的另一处不同是默认 gcc 的版本。Ubuntu 22.04 默认 gcc 版本是 11.2.0,我这里同时安装了 gcc-12;Ubuntu 23.10 默认 gcc 版本是 13.2.0。同时考虑到 clang 默认使用的标准库是 stdlibc++,进而会使用 gcc 的头文件,那么 gcc 的版本就确实会影响到 clang 的编译结果了。
简单查询,可以通过 clang -v
查看当前使用的 gcc 工具链目录,Ubuntu 22.04 上显示的是:
ubuntu clang version 16.0.6 (++20230710042027+7cbfla259152-1~exp1~20230710162048.105)
Target: x86_64-pc-linux-gnu
Thread model: posix
InstalledDir: /usr/bin
Found candidate GCC installation: /usr/bin/../lib/gcc/x86_64-linux-gnu/11
Found candidate GCC installation: /usr/bin/../lib/gcc/x86_64-linux-gnu/12
Selected GCC installation: /usr/bin/../lib/gcc/x86_64-linux-gnu/12
Candidate multilib: .;@m64
Selected multilib: .;@m64
Ubuntu 23.10 的结果是:
Ubuntu clang version 16.0.6 (15)
Target: x86_64-pc-linux-gnu
Thread model: posix
InstalledDir: /usr/bin
Found candidate GCC installation: /usr/bin/../lib/gcc/x86_64-linux-gnu/12
Found candidate GCC installation: /usr/bin/../lib/gcc/x86_64-linux-gnu/13
Selected GCC installation: /usr/bin/../lib/gcc/x86_64-linux-gnu/13
Candidate multilib: .;@m64
Selected multilib: .;@m64
clang 默认会使用它能找到的最新版本的 gcc,当然也可以通过 --gcc-install-dir
指定。