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:
@@ -13,6 +13,14 @@ set(CMAKE_CXX_STANDARD 20)
|
|||||||
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
||||||
set(CMAKE_CXX_EXTENSIONS OFF)
|
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
|
# Emit compile_commands.json so clangd resolves includes/flags. Ignored by the
|
||||||
# Visual Studio generator, so configure the Ninja build (build-clangd/) for this;
|
# Visual Studio generator, so configure the Ninja build (build-clangd/) for this;
|
||||||
# .clangd points clangd at that compilation database.
|
# .clangd points clangd at that compilation database.
|
||||||
|
|||||||
@@ -114,7 +114,6 @@ From an in-depth review pass. Each item is fixed test-first (a failing test, the
|
|||||||
as its own commit; "verify" items are confirmed real before any change, and dropped if not.
|
as its own commit; "verify" items are confirmed real before any change, and dropped if not.
|
||||||
|
|
||||||
Features:
|
Features:
|
||||||
- **Static CRT (`/MT`) for `coop_hook.dll`** (x64 + x86) so it loads in games without the VC++ redist.
|
|
||||||
- **Stale Vulkan-layer registration cleanup** — remove a leftover `HKCU` implicit-layer entry from a
|
- **Stale Vulkan-layer registration cleanup** — remove a leftover `HKCU` implicit-layer entry from a
|
||||||
crashed prior run on host startup.
|
crashed prior run on host startup.
|
||||||
|
|
||||||
|
|||||||
@@ -43,6 +43,6 @@ else()
|
|||||||
set_target_properties(coop_hook PROPERTIES OUTPUT_NAME "coop_hook")
|
set_target_properties(coop_hook PROPERTIES OUTPUT_NAME "coop_hook")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# TODO(dist): statically link the VC runtime (/MT) so the DLL loads in games on
|
# The VC runtime is statically linked (/MT) project-wide (see CMAKE_MSVC_RUNTIME_LIBRARY in the top
|
||||||
# machines without the matching VC redist. Deferred until SafetyHook + Zydis are
|
# CMakeLists), so this DLL -- and the SafetyHook/Zydis it links -- carry no VC++ redist dependency and
|
||||||
# also forced to a static CRT to avoid a /MT-vs-/MD mismatch.
|
# load into games on any machine.
|
||||||
|
|||||||
Reference in New Issue
Block a user