<?xml version="1.0"?>
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.3//EN"
               "http://www.oasis-open.org/docbook/xml/4.3/docbookx.dtd" [
]>
<refentry id="gtk-compiling" revision="4 Feb 2001">
<refmeta>
<refentrytitle>Compiling GTK+ Applications</refentrytitle>
<manvolnum>3</manvolnum>
<refmiscinfo>GTK Library</refmiscinfo>
</refmeta>

<refnamediv>
<refname>Compiling GTK+ Applications</refname>
<refpurpose>
How to compile your GTK+ application
</refpurpose>
</refnamediv>

<refsect1>
<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):
<programlisting>
$ pkg-config --cflags gtk+-2.0
 -I/usr/include/gtk-2.0 -I/usr/lib/gtk-2.0/include -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I/usr/include/pango-1.0 -I/usr/X11R6/include -I/usr/include/freetype2 -I/usr/include/atk-1.0  
$ pkg-config --libs gtk+-2.0
 -L/usr/lib -L/usr/X11R6/lib -lgtk-x11-2.0 -lgdk-x11-2.0 -lXi -lgdk_pixbuf-2.0 -lm -lpangox -lpangoxft -lXft -lXrender -lXext -lX11 -lfreetype -lpango -latk -lgobject-2.0 -lgmodule-2.0 -ldl -lglib-2.0  
</programlisting>
</para>
<para>
The simplest way to compile a program is to use the "backticks"
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:
<programlisting>
$ cc `pkg-config --cflags --libs gtk+-2.0` hello.c -o hello
</programlisting>
</para>

<para>
If you want to make sure that your program doesn't use any deprecated 
functions, you can define the preprocessor symbol GTK_DISABLE_DEPRECATED
by using the command line option <literal>-DGTK_DISABLE_DEPRECATED=1</literal>.
There are similar symbols GDK_DISABLE_DEPRECATED, 
GDK_PIXBUF_DISABLE_DEPRECATED and G_DISABLE_DEPRECATED for GDK, GdkPixbuf and
GLib. 
</para>

<para>
If you want to make sure that your program doesn't use any functions which 
may be problematic in a multihead setting, you can define the preprocessor
symbol GDK_MULTIHEAD_SAFE by using the command line option 
<literal>-DGTK_MULTIHEAD_SAFE=1</literal>.
</para>

<para>
The recommended way of using GTK+ has always been to only include the
toplevel headers <filename>gtk.h</filename>, <filename>gdk.h</filename>, 
<filename>gdk-pixbuf.h</filename>.
If you want to make sure that your program follows this recommended
practise, you can define the preprocessor symbols GTK_DISABLE_SINGLE_INCLUDES
and GDK_PIXBUF_DISABLE_SINGLE_INCLUDES to make GTK+ generate an error
when individual headers are directly included.
There are some exceptions: <filename>gdkkeysyms.h</filename> is not included in
<filename>gdk.h</filename> because the file is quite large; see
<link linkend="gdk-Keyboard-Handling">Key Values documentation</link>.
<filename>gdkx.h</filename> must be included independently because It's
platform-specific; see
<link linkend="gdk-X-Window-System-Interaction">X Window System Interaction</link>
documentation.
The same for <filename>gtkunixprint.h</filename> if you use the non-portable
<link linkend="GtkPrintUnixDialog">GtkPrintUnixDialog</link> API.
</para>

<para>
The next major version, GTK+ 3,  will remove many implementation details and
struct members from its public headers. To ensure that your application will
not have problems with this, you can define the preprocessor symbol
GSEAL_ENABLE. This will make the compiler catch all uses of direct access to
struct fields so that you can go through them one by one and replace them with
a call to an accessor function instead.
</para>

</refsect1>
</refentry>
