| # 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: | |
| - <https://learn.microsoft.com/en-us/cpp/cppcx/crt-functions-not-supported-in-universal-windows-platform-apps> | |
| ## 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: | |
| - <https://learn.microsoft.com/en-us/windows/uwp/> | |
| 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. |