winstorecompat

This subdirectory contains winstorecompat and windowsappcompat libraries which are intended to be used with mingw-w64 toolchains to produce code for Windows 8/8.1 Store Apps and UWP Apps.

This document contains basic information on how to compile code for Windows 8/8.1 Store/UWP Apps with both mingw-w64 and MSVC. This document does not describe how to package and release such apps, for this you will have to refer to Microsoft Documentation.

When compiling code for Windows Store/UWP, you need to keep in mind that not all CRT/Windows API functions are available for use. This is one reason why winstorecompat and windowsappcompat exist - they provide stubs or simple replacements for functions which are not available for use in such apps.

Documentation for each Windows API function documents whether it is available to UWP apps or not. List of CRT functions which are not available to such apps can be found here:

Windows 8/8.1 Store Apps

To compile code for Windows 8/8.1 Store:

  • use -DWINAPI_FAMILY=WINAPI_FAMILY_APP when compiling.
  • use -lwinstorecompat when linking.
  • link with msvcr120_app.dll, which is a version of msvcr120.dll for use with Windows 8/8.1 Store apps.

Depending on whether you use gcc or clang, you need to use different options in order to link with msvcr120_app.dll:

  • gcc: -mcrtdll=msvcr120_app
  • clang: -lmsvcr120_app

UWP Apps

Microsoft Documentaion for UWP can be found here:

To compile code for UWP:

  • use -DWINAPI_FAMILY=WINAPI_FAMILY_APP when compiling.
  • link with windowsapp.lib (-lwindowsapp, in case of mingw-w64).

When using mingw-w64, you also need:

  • link with libucrtapp.a instead of libucrt.a.
  • use -lwindowsappcompat when linking.

Depending on whether you use gcc or clang, you need to use different options in order to link with libucrtapp.a:

  • gcc: -mcrtdll=ucrtapp
  • clang: -lucrtapp

Current Limitations

Current mingw-w64 support for Windows 8/8.1 Store and UWP Apps is not perfect, and you may encounter some issues depending on what toolchain you use.

gcc

Using gcc with -lwindowsapp is not enough to produce valid code for UWP.

UWP code must be linked against api sets (api-ms-win-* assemblies), however static mingw-w64 code that is linked into executables will end up referencing symbols directly from kernel32.dll.

There are two ways to workaround this issue:

  1. Get gcc specs with gcc -dumpspecs, modify them and pass modified specs file with gcc -specs=.

    You want to replace -lkernel32 that follows mingw-w64's -l flags with -lwindowsapp and remove other -l flags for system Windows libraries.

  2. Build mingw-w64 runtime, install it locally and replace import libraries for some system libraries (such as libkernel32.a) with libwindowsapp.a.

    This way -lkernel32 and others will link with libwindowsapp.a disguised as libkernel32.a.

clang

Using clang with -lwindowsapp works properly only with lld. You may want to use -fuse-ld=lld when linking to ensure that clang invokes lld and not GNU ld.