| Chun-wei Fan `<fanc999@yahoo.com.tw>` |
| Philip Withnall `<withnall@endlessm.com>` |
| Nirbheek Chauhan `<nirbheek@centricular.com>` |
| |
| This document was last updated in 2019. You're reading this in the future, and |
| lots of information might be misleading or outdated in your age. You have been |
| warned. |
| |
| # General |
| |
| For prebuilt binaries (DLLs and EXEs) and developer packages (headers, |
| import libraries) of GLib, Pango, GTK etc for Windows, go to |
| https://www.gtk.org/docs/installations/windows/ . They are for "native" |
| Windows meaning they use the Win32 API and Microsoft C runtime library |
| only. No POSIX (Unix) emulation layer like Cygwin is involved. |
| |
| To build GLib on Win32, you can use either GCC ("MinGW") or the Microsoft |
| Visual Studio toolchain. For the latter, Visual Studio 2015 and later are |
| recommended. For older Visual Studio versions, see below. |
| |
| You can also cross-compile GLib for Windows from Linux using the |
| cross-compiling mingw packages for your distro. |
| |
| Note that to just *use* GLib on Windows, there is no need to build it |
| yourself. |
| |
| On Windows setting up a correct build environment is very similar to typing |
| `meson; ninja` like on Linux. |
| |
| The following preprocessor macros are to be used for conditional |
| compilation related to Win32 in GLib-using code: |
| |
| - `G_OS_WIN32` and `G_PLATFORM_WIN32` are defined when compiling for native |
| Win32, without any POSIX emulation, other than to the extent provided by |
| the bundled Microsoft C library. Either can be used to check when |
| conditionally compiling GLib-using code for Win32. |
| |
| - `G_WITH_CYGWIN` is defined if compiling for the Cygwin |
| environment. Note that `G_OS_WIN32` is *not* defined in that case, as |
| Cygwin is supposed to behave like Unix. `G_OS_UNIX` *is* defined by a GLib |
| for Cygwin, but `G_PLATFORM_WIN32` is *no longer* defined by GLib for |
| Cygwin. |
| |
| These macros are defined in `glibconfig.h`, and are thus available in |
| all source files that include `<glib.h>`. |
| |
| Additionally, there are the compiler-specific macros: |
| - `__GNUC__` is defined when using GCC or Clang |
| - `__clang__` is defined when using Clang or Clang-CL |
| - `_MSC_VER` is defined when using MSVC or Clang-CL |
| |
| `G_OS_WIN32` implies using the Microsoft C runtime, which used to be |
| `msvcrt.dll` and is now the [Universal CRT](https://docs.microsoft.com/en-us/cpp/c-runtime-library/crt-library-features?view=vs-2015) |
| when building with Visual Studio. When using the MinGW-GCC toolchain, the CRT |
| in use depends on the settings used while the toolchain was built. We highly |
| recommend [using the Universal CRT when building with |
| MinGW](https://mingwpy.github.io/ucrt.html) too. |
| |
| GLib is not actively tested with the static versions of the UCRT, but if you |
| need to use those, patches are welcome. |
| |
| # Building software that use GLib or GTK |
| |
| Building software that just *uses* GLib or GTK also require to have |
| the right compiler set up the right way. If you intend to use MinGW-GCC, |
| follow the relevant instructions below in that case, too. |
| |
| You should link to GLib using the `-mms-bitfields` GCC flag. This flag means |
| that the struct layout rules are identical to those used by MSVC. This is |
| essential if the same DLLs are to be usable both from gcc- and MSVC-compiled |
| code. |
| |
| ## Cross-CRT issues |
| |
| You should take care that the DLLs that your code links to are using the same |
| C runtime library. Not doing so can and likely will lead to panics and crashes |
| **unless** you're very careful while passing objects allocated by a library |
| linked with one CRT to a library linked to another CRT, or (more commonly) not |
| doing that at all. |
| |
| If you *do* pass CRT objects across CRT boundaries, do not file any issues |
| about whatever happens next. |
| |
| To give an example, opening a `FILE` handle created by one CRT cannot be |
| understood by any other CRT, and will lead to an access violation. You also |
| cannot allocate memory in one CRT and free it using another. |
| |
| There are [many other cases where you must not allow objects to cross CRT boundaries](https://docs.microsoft.com/en-us/cpp/c-runtime-library/potential-errors-passing-crt-objects-across-dll-boundaries?view=vs-2019), |
| but in theory if you're **very very** careful, you can make things work. Again, |
| please do not come to us for help if you choose to do this. |
| |
| # Building GLib |
| |
| You can build GLib with MinGW-GCC, MSVC, or (experimentally) with Clang-CL. |
| |
| For all compilers, you will need the following: |
| |
| - Install Python 3.6.x or newer, either 32-bit or 64-bit. We recommend enabling |
| the option to add it to your `PATH`. |
| - [Install Meson](https://mesonbuild.com/Getting-meson.html) |
| - Install the [Ninja build tool](https://github.com/ninja-build/ninja/releases), which can also be |
| installed with `pip3`. You can skip this step if you want to generate Visual |
| Studio project files. |
| - [git for Windows](https://gitforwindows.org/) is required, since Meson makes |
| use of git to download dependencies using subprojects. |
| |
| ## Building with MinGW-GCC |
| |
| Open your MSYS or [MSYS2](https://www.msys2.org/) shell where you have the |
| MinGW-GCC toolchain installed, and build GLib [like any other Meson |
| project](https://mesonbuild.com/Quick-guide.html#compiling-a-meson-project). |
| |
| ## Building with Visual Studio 2015 or newer |
| |
| Meson is now the only supported method of building GLib using Visual Studio. |
| |
| To do a build using Meson, do the following: |
| |
| - Open a Visual Studio (or SDK) command prompt that matches the Visual Studio |
| version and build platform (Win32/x86, x64, etc.) that will be used in all |
| the following steps. |
| |
| - Create an empty directory/folder for the build inside your GLib sources |
| directory, say, `_builddir`, and `cd` into it. |
| |
| - Set up the build using Meson: |
| |
| ```cmd |
| > meson .. --buildtype=<release|debug|debugoptimized> --prefix=<path> [--backend=vs] |
| ``` |
| |
| Please see [the Meson docs](https://mesonbuild.com/Builtin-options.html#core-options) |
| for an explanation for `--buildtype`. |
| |
| The path passed for `--prefix` need not to be on the same drive as where the |
| build is carried out, but it is recommended to use forward slashes for this |
| path. The `--backend=vs` option can be used if the Visual Studio project |
| generator is preferred over using Ninja. |
| |
| - Build, test and install the build: |
| Run `ninja` to build, `meson test` to test and `meson install` to install the |
| build. If you used `--backend=vs`, instead of running `ninja`, you need to |
| use `msbuild` or you can open the generated solution in Visual Studio. |
| |
| ## Building with old versions of Visual Studio |
| |
| The steps are the same as above, with the following notes about issues that you might face. |
| |
| ### C4819 build errors |
| |
| If you are building GLib-based libraries or applications, or GLib itself |
| and you see a `C4819` error (or warning, before `C4819` is treated as an error |
| in `msvc_recommended_pragmas.h`), please be advised that this error/warning should |
| not be disregarded, as this likely means portions of the build are not being |
| done correctly, as this is an issue of Visual Studio running on CJK (East Asian) |
| locales. This is an issue that also affects builds of other projects, such as |
| QT, Firefox, LibreOffice/OpenOffice, Pango and GTK, along with many other projects. |
| |
| To overcome this problem, please set your system's locale setting for non-Unicode to |
| English (United States), reboot, and restart the build, and the code should build |
| normally. |
| |
| ### Support for pre-2012 Visual Studio |
| |
| This release of GLib requires at least the Windows 8 SDK in order to be built |
| successfully using Visual Studio, which means that it is no longer supported to |
| build GLib with Visual Studio 2008 nor 2010. People that still need to use |
| Visual Studio 2008 or 2010 should continue to use glib-2.66.x. |