直接用dnf install llvm仅安装最小运行时集,缺少clang、lld、llvm-devel等开发组件;需手动执行sudo dnf install clang lld llvm-devel才能满足c++20项目或openage构建需求。

直接用 dnf install llvm 装出来的不是开发用的完整 LLVM,而是仅含运行时库和基础工具(如 llvm-config、llc)的最小集,缺少 clang、lld、clang++、头文件和静态库 —— 想编译 C++20 项目或构建 openage 这类依赖 LLVM 工具链的项目,这远远不够。
装 clang + lld + 开发头文件:必须显式指定子包
Fedora 把 LLVM 拆成十几个独立 RPM 包,llvm 主包不拉取任何编译器组件。你需要手动安装以下核心子包:
-
clang:提供clang、clang++、clangd -
lld:LLVM 原生链接器,比系统默认ld.bfd更快、支持 LTO -
llvm-devel:C++ 头文件、libLLVM.so符号链接、llvm-config—— 编译依赖 LLVM 的项目(如 openage 的 C++ 部分)必需 -
llvm-static(可选):如果你要静态链接 LLVM 库(例如做自定义 pass),需要它
执行命令:
sudo dnf install clang lld llvm-devel
验证是否到位:
clang --version<br>llvm-config --version<br>llvm-config --libs core support
为什么不能只装 llvm 或依赖自动解决?
Fedora 的 llvm 包设计为“运行时优先”,Requires: 字段里没声明对 clang 的依赖 —— 这是故意的,避免普通用户被装一堆不用的编译器工具。DNF 不会跨包自动补全开发组件,--assumeyes 或 --best 都无效。
常见错误现象:
- 运行
cmake时提示Could not find clang++或llvm-config: command not found -
make报错:fatal error: 'llvm/IR/IRBuilder.h' file not found(缺llvm-devel) - CMakeLists.txt 里
find_package(LLVM REQUIRED CONFIG)失败(因llvm-devel未提供LLVMConfig.cmake,但实际它提供了 —— 只要你装了)
确认版本是否匹配 openage 要求(C++20 + LLVM 17)
openage 明确要求 LLVM 17+(见其 CMakeLists.txt 中 find_package(LLVM 17 REQUIRED CONFIG))。Fedora 34+ 默认仓库中 clang 和 llvm-devel 是 LLVM 17.x,但需验证:
dnf list installed | grep -E "(clang|llvm)"
输出应类似:
clang.x86_64 17.0.6-2.fc39 @updates<br>llvm-devel.x86_64 17.0.6-2.fc39 @updates
若版本过低(如显示 15.x),说明系统未启用 updates 仓库,或 Fedora 版本太老(fc38 及以下可能只有 LLVM 15)。此时不能靠 dnf update 升级 LLVM 主版本,必须升级整个系统或手动编译 LLVM —— 后者复杂度陡增,不推荐。
离线环境怎么装?别用 yumdownloader
yumdownloader 是 YUM 插件,在 DNF 系统上不可用;且它不处理跨仓库依赖(如 llvm-devel 可能来自 updates,而 clang 来自 baseos)。正确做法是:
- 在联网机器上运行:
dnf download --resolve clang lld llvm-devel - 该命令会自动下载所有 RPM 及其依赖(包括
llvm-libs、libstdc++-devel等隐式依赖) - 把下载的 RPM 全部拷到目标机,再用
dnf install *.rpm安装
注意:--resolve 必须加,否则只下主包,不下载 llvm-libs 这类底层依赖,安装会失败。
最容易被忽略的一点:装完 llvm-devel 后,llvm-config 输出的 include 路径(如 /usr/include/llvm/)里没有 C++20 标准库头文件 —— 那是 gcc-c++ 或 clang 自己带的,不是 LLVM 提供的。别看到 #include <concepts></concepts> 报错就怀疑 LLVM 装错了,先检查 g++ --version 或 clang++ --std=c++20 是否可用。











