Safeguard
Developer Tools•

vcpkg baseline or override: how do you pin C++ dependencies?

In vcpkg manifest mode a baseline sets the version floor and an override forces an exact version. Here is when to use each for reproducible C++ builds.

Safeguard Security Team
3 min read

In vcpkg manifest mode, a builtin-baseline sets the default version for every dependency, while an override forces one exact version and ignores all other constraints. Use the baseline for steady, reproducible builds and an override when you must hold one library at a known version, for example while a fix is tested.

What each setting does

The Microsoft Learn reference for vcpkg versioning separates three ideas.

  • Baseline. A global floor for the whole dependency graph. For the built-in registry it is the builtin-baseline field, a commit hash of the registry. It lets you keep every dependency current without writing a constraint for each one.
  • version>=. A minimum for one dependency. vcpkg selects the lowest version that satisfies all constraints, so you rarely need an upper bound.
  • overrides. Forces vcpkg to ignore all other version constraints and use the version you name. The docs describe it as useful for pinning exact versions and for resolving conflicts.

Versioning only works in manifest mode. If a manifest has no baseline and no registries configured, vcpkg falls back to classic mode and ignores versioning information. That fallback is easy to hit by accident.

A decision guide

SituationUse
Normal release build, want a stable known setBaseline, committed in vcpkg.json
A library needs at least a fixed versionversion>= on that library
A transitive dependency pulls an older release you cannot acceptOverride
Need to freeze one library while the rest movesOverride, with a note and a review date

Keep overrides short lived

An override is a promise that you will remember why you pinned. Add a comment in your change description, or a tracking issue, and review it when the baseline moves. An override that outlives the reason for it can quietly hold a vulnerable version in place long after a fix exists.

The same applies to the baseline. Bumping it is the moment your dependency set changes, so treat a baseline update as a reviewed pull request with a changed-versions summary, not a routine refresh.

Tie it to your SBOM

Whatever vcpkg resolves is what belongs in your bill of materials. Generate the list from the resolved graph, not from the constraints you wrote, because the two can differ.

Where Safeguard fits

If you want an inventory your reviewers can query, Safeguard offers SBOM and dependency scanning with policies and gates on pull requests. It works from the source and manifests it supports. A free scan is at gold.safeguard.sh/scan.

Try it yourself

Open a component and check which exact version is recorded. That is the number your baseline or override should be producing.

Click through it at your own pace, or open it full screen.

Quick check

Does vcpkg compare version-string with version?

No. By design vcpkg does not compare versions that use different schemes, so a version-string of 7.1.3 cannot be ordered against a version of 7.1.4.

Can an override add a package that nothing depends on?

No. For an override to take effect the package must already be part of the dependency graph, either declared at the top level or pulled in by another dependency.

Sources

Last reviewed: 19 October 2026.

Never miss an update

Weekly insights on software supply chain security, delivered to your inbox.

Self-healing security runs on Safeguard.

Your first fix PR is minutes away.

No sales call required, even your agent can complete the purchase over MCP.