Statically link the VC runtime (/MT) so the DLL needs no VC++ redist

The injected coop_hook.dll links the dynamic CRT, so it failed to load into games
on machines without the matching VC++ redistributable -- a real field failure of
the core feature. It was deferred because SafetyHook + Zydis (linked into the DLL)
default to /MD, so a per-target /MT would mismatch.

Set CMAKE_MSVC_RUNTIME_LIBRARY to MultiThreaded[Debug] project-wide (CMP0091 NEW,
available at our 3.21 minimum). Every target -- the DLL, the vendored deps, the
host, tools, and tests, on both x64 and the x86 sub-build -- now shares one static
CRT, so there's no mismatch and the whole tool ships redist-free.

Verified: x64 + x86 full builds are clean; dumpbin shows coop_hook.dll and
coop_hook_x86.dll import only system DLLs (USER32/ole32/d3d11/KERNEL32) -- no
VCRUNTIME/MSVCP -- and the /MT test binaries run.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-06-24 02:17:19 +02:00
parent e096a9f2e2
commit d318ae62a1
3 changed files with 11 additions and 4 deletions

View File

@@ -13,6 +13,14 @@ set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
# Statically link the VC runtime everywhere (/MT, /MTd in Debug). The injected coop_hook.dll must load
# into games on machines without the matching VC++ redist; SafetyHook + Zydis are linked into it, so a
# per-target /MT would clash with their default /MD. Setting it project-wide keeps every target -- the
# DLL, the host, dev tools, tests, and the vendored deps -- on one static CRT (and ships the whole tool
# redist-free). CMP0091 (NEW since our 3.21 minimum) makes this abstraction select the actual flag.
cmake_policy(SET CMP0091 NEW)
set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>")
# Emit compile_commands.json so clangd resolves includes/flags. Ignored by the
# Visual Studio generator, so configure the Ninja build (build-clangd/) for this;
# .clangd points clangd at that compilation database.