<chapter id="gtk-compiling">
  <title>Compiling GTK Applications on UNIX</title>
  <para>
    To compile a GTK application, you need to tell the compiler where to
    find the GTK header files and libraries. This is done with the
    <literal>pkg-config</literal> utility.
  </para>
  <para>
    The following interactive shell session demonstrates how
    <literal>pkg-config</literal> is used (the actual output on your
    system may be different):
  </para>
  <programlisting>
$ pkg-config --cflags gtk4
 -pthread -I/usr/include/gtk-4.0 -I/usr/lib64/gtk-4.0/include -I/usr/include/cairo -I/usr/include/pango-1.0 -I/usr/include/glib-2.0 -I/usr/lib64/glib-2.0/include -I/usr/include/pixman-1 -I/usr/include/freetype2 -I/usr/include/libpng12
$ pkg-config --libs gtk4
 -pthread -lgtk-4 -lgdk-4 -lgio-2.0 -lpangoft2-1.0 -lgdk_pixbuf-2.0 -lpangocairo-1.0 -lcairo -lpango-1.0 -lfreetype -lfontconfig -lgobject-2.0 -lgmodule-2.0 -lgthread-2.0 -lrt -lglib-2.0
</programlisting>
  <para>
    The simplest way to compile a program is to use the
    <quote>backticks</quote> feature of the shell. If you enclose a
    command in backticks (<emphasis>not single quotes</emphasis>), then
    its output will be substituted into the command line before
    execution. So to compile a GTK Hello, World, you would type the
    following:
  </para>
  <programlisting>
$ cc `pkg-config --cflags gtk4` hello.c -o hello `pkg-config --libs gtk4`
</programlisting>
  <para>
    Deprecated GTK functions are annotated to make the compiler emit
    warnings when they are used (e.g. with gcc, you need to use the
    -Wdeprecated-declarations option). If these warnings are
    problematic, they can be turned off by defining the preprocessor
    symbol <link linkend="GDK-DISABLE-DEPRECATION-WARNINGS:CAPS"><literal>GDK_DISABLE_DEPRECATION_WARNINGS</literal></link> by using the commandline
    option <literal>-DGDK_DISABLE_DEPRECATION_WARNINGS</literal>.
  </para>
  <para>
    GTK deprecation annotations are versioned; by defining the macros
    <link linkend="GDK-VERSION-MIN-REQUIRED:CAPS"><literal>GDK_VERSION_MIN_REQUIRED</literal></link> and <link linkend="GDK-VERSION-MAX-ALLOWED:CAPS"><literal>GDK_VERSION_MAX_ALLOWED</literal></link>, you can
    specify the range of GTK versions whose API you want to use. APIs
    that were deprecated before or introduced after this range will
    trigger compiler warnings.
  </para>
  <para>
    Here is how you would compile hello.c if you want to allow it to use
    symbols that were not deprecated in 4.2:
  </para>
  <programlisting>
$ cc `pkg-config --cflags gtk4` -DGDK_VERSION_MIN_REQUIRED=GDK_VERSION_4_2 hello.c -o hello `pkg-config --libs gtk4`
</programlisting>
  <para>
    And here is how you would compile hello.c if you don’t want it to
    use any symbols that were introduced after 4.2:
  </para>
  <programlisting>
$ cc `pkg-config --cflags gtk4` -DGDK_VERSION_MAX_ALLOWED=GDK_VERSION_4_2 hello.c -o hello `pkg-config --libs gtk4`
</programlisting>
  <para>
    The older deprecation mechanism of hiding deprecated interfaces
    entirely from the compiler by using the preprocessor symbol
    GTK_DISABLE_DEPRECATED is still used for deprecated macros,
    enumeration values, etc. To detect uses of these in your code, use
    the commandline option <literal>-DGTK_DISABLE_DEPRECATED</literal>.
    There are similar symbols GDK_DISABLE_DEPRECATED,
    GDK_PIXBUF_DISABLE_DEPRECATED and G_DISABLE_DEPRECATED for GDK,
    GdkPixbuf and GLib.
  </para>
</chapter>
