From 7ef560ba8af0563279d07460bf217cf73bc0488b Mon Sep 17 00:00:00 2001 From: Talon Date: Wed, 24 Jun 2026 01:28:29 +0200 Subject: [PATCH] fix(windows): statically link MinGW runtime into all binaries The static-MinGW recipe (-static-libgcc -static-libstdc++ -static) was only applied inside the VOICECAT_BUILD_SHARED branch in core/CMakeLists, so it covered voicecat.dll but not voicecat-server.exe / vccli. With the x64-mingw-static triplet only vcpkg's own deps are static; the GCC/MinGW runtime stays dynamic, so the server failed to start on clean Windows machines with missing libgcc_s_seh-1.dll / libwinpthread-1.dll / libstdc++-6.dll. Move the recipe to a global add_link_options (WIN32 AND MINGW) so every produced binary embeds the runtime. Verified with objdump -p: only Windows system DLLs remain. Co-Authored-By: Claude Opus 4.8 --- CMakeLists.txt | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index f7d93b0..48e73f6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -37,6 +37,20 @@ set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) +# ── Static MinGW runtime (Windows) ──────────────────────────────────────────── +# x64-mingw-static only statically links vcpkg's OWN deps (protobuf, sodium, ...); +# the GCC/MinGW runtime stays dynamic by default, so every produced .exe/.dll +# otherwise depends on libgcc_s_seh-1.dll / libwinpthread-1.dll / libstdc++-6.dll +# at runtime — DLLs that exist on a dev box (MSYS2/UCRT64) but not on a clean +# Windows machine, where the server then fails to start with "… was not found". +# Apply the fully-static-MinGW recipe to ALL targets so binaries are portable. +# (The SHARED voicecat.dll already sets these in core/CMakeLists.txt; the duplicate +# is harmless. Verify with: objdump -p build//bin/voicecat-server.exe | +# grep "DLL Name" — only Windows system DLLs should remain.) +if(WIN32 AND MINGW) + add_link_options(-static-libgcc -static-libstdc++ -static -lwinpthread) +endif() + # ── Targets ─────────────────────────────────────────────────────────────────── add_subdirectory(core)