Vault/build_deps_headers_vs_runtime.md

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 missing spirv-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 .h files 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).