diff --git a/releasenotes.md b/releasenotes.md index 3f9ed21b7..935499d0c 100644 --- a/releasenotes.md +++ b/releasenotes.md @@ -70,6 +70,7 @@ - Interface resolution when part of generics #1348. - Assert not properly traced #1354. - Ordering issues with `$include` / `$exec` fixed #1302. +- Issues with wincrt linking. ### Stdlib changes diff --git a/src/build/libraries.c b/src/build/libraries.c index f261ac3ac..271e33ca6 100644 --- a/src/build/libraries.c +++ b/src/build/libraries.c @@ -273,9 +273,13 @@ void resolve_libraries(BuildTarget *build_target) { build_target->win.crt_linking = library->win_crt; } - else if (library->win_crt != build_target->win.crt_linking) + else if (target->win_crt != build_target->win.crt_linking) { - WARNING("'wincrt' mismatch between resolved build setting and library '%s', library settings will be ignored.", library->dir); + WARNING("'wincrt' mismatch between resolved build setting ('%s') and library '%s' ('%s'), " + "library settings will be ignored.", + wincrt_linking[build_target->win.crt_linking], + library->dir, + wincrt_linking[target->win_crt]); } } if (vec_size(target->csource_dirs)) diff --git a/src/compiler/linker.c b/src/compiler/linker.c index 68ee31ee6..c8c26558a 100644 --- a/src/compiler/linker.c +++ b/src/compiler/linker.c @@ -81,7 +81,7 @@ static void linker_setup_windows(const char ***args_ref, Linker linker_type) FOREACH(Library *, library, compiler.build.library_list) { WinCrtLinking wincrt = library->target_used->win_crt; - if (wincrt == WIN_CRT_DEFAULT) continue; + if (wincrt == WIN_CRT_DEFAULT || wincrt == linking) continue; if (linking != WIN_CRT_DEFAULT) { WARNING("Mismatch between CRT linking in library %s and previously selected type.", library->dir); @@ -140,9 +140,6 @@ static void linker_setup_windows(const char ***args_ref, Linker linker_type) add_arg(str_printf("/LIBPATH:%s", windows_sdk->windows_sdk_ucrt_library_path)); add_arg(str_printf("/LIBPATH:%s", windows_sdk->vs_library_path)); } - // Do not link any. - if (compiler.build.win.crt_linking == WIN_CRT_NONE) return; - linking_add_link(&compiler.linking, "kernel32"); linking_add_link(&compiler.linking, "ntdll"); linking_add_link(&compiler.linking, "user32"); @@ -151,6 +148,9 @@ static void linker_setup_windows(const char ***args_ref, Linker linker_type) linking_add_link(&compiler.linking, "Ws2_32"); linking_add_link(&compiler.linking, "legacy_stdio_definitions"); + // Do not link any. + if (compiler.build.win.crt_linking == WIN_CRT_NONE) return; + if (compiler.build.win.crt_linking == WIN_CRT_STATIC) { if (is_debug)