1.9 KiB
1.9 KiB
Compile-Time Headers vs. Runtime Libraries
What we did
- Hit two build failures in a row while compiling llama.cpp with Vulkan support: first missing
vulkan-headers, then missingspirv-headers— despite the Vulkan driver (vulkan-radeon) and loader (vulkan-icd-loader) already being installed and working fine (games, desktop compositor, etc.). - Installed the missing header packages and the build proceeded cleanly.
Key distinction / Mental model
Two separate concerns get bundled under "I have Vulkan installed," but they're not the same thing:
- Runtime pieces (
vulkan-icd-loader,vulkan-radeon) let an already-compiled program talk to the GPU right now. - Build-time pieces (
vulkan-headers,spirv-headers) are plain-text.hfiles with function/type declarations that the compiler needs to translate new source code calling those functions into machine code.
A working driver does not imply the headers are present, and vice versa — different packages, different points in the software lifecycle. This generalizes beyond Vulkan: any "-dev" / "-headers" package split (common across Linux libraries) follows the same pattern.
Commands / syntax
| Command | What it does |
|---|---|
pacman -Q <pkg> |
Check if a package is installed (fails loudly if not — good for audits) |
pacman -Ql <pkg> |
List files a package provides, to see whether it's headers, a library, or both |
sudo pacman -S vulkan-headers spirv-headers |
Install Vulkan build-time dependencies on Arch |
When to use this
When a build fails with "could not find X headers" or "unknown type/function" errors for a library you're sure is "installed" — check whether you have the runtime package, the headers package, or both.
Index line
build_deps_headers_vs_runtime.md — Compile-time headers vs. runtime libraries: why a working driver doesn't mean a package's headers are installed too (Vulkan/SPIRV example).