Budowanie wielomodułowych programów
Kurs C z elementami C++
Marek Piotrów - Wykład 11
GTK - graficzny interfejs u˙zytkownika w C oraz
skrypty dla make
18 grudnia 2007
Uwaga: w załacznikach do tego pliku znajduj ˛
a si ˛e teksty
prezentowanych przykładów (do łatwiejszego kopiowania).
Marek Piotrów - Wykład 11
Budowanie wielomodułowych programów
Bibioteka GTK+
GTK+ jest darmow ˛
a bibliotek ˛
a przeznaczon ˛
a do tworzenia
graficznego interfejsu u˙zytkownika.
Została napisana w C na potrzeby programu GIMP (st ˛
ad
nazwa Gimp ToolKid), ale ma struktur ˛e obiektow ˛
a.
Mozna z niej korzysta´c w wielu j ˛ezykach programowania
(C, C++, C#, Ada, Perl, itd.).
Programy napisane z u˙zyciem tej biblioteki s ˛
a przeno´sne
pomiedzy ró˙znymi systemami operacyjnymi.
GTK+ korzysta z bibliotek: GLib, Pango i ATK (trzeba je
zainstalowa´c, aby mo˙zna było kompilowa´c programy
u˙zywaj ˛
ace GTK).
Marek Piotrów - Wykład 11
Budowanie wielomodułowych programów
GTK-test: obsługa zdarze ´n
#include <gtk/gtk.h>
static void test_nacisniecia( GtkWidget *widget, gpointer
data )
{
g_print ("GTK-test - %s zastal nacisniety\n", (gchar *) data);
}
static gboolean wyjscie_sys( GtkWidget *widget,
GdkEvent
*event,
gpointer
data )
{
gtk_main_quit ();
return FALSE;
}
static void wyjscie_prz( GtkWidget *widget, gpointer
data )
{
gtk_main_quit ();
return ;
}
static void wprowadzony_tekst( GtkWidget *widget, GtkWidget *text )
{
const gchar *wejscie;
wejscie = gtk_entry_get_text (GTK_ENTRY (text));
g_print ("GTK-test wprowadzono: %s\n", wejscie);
}
Marek Piotrów - Wykład 11
Budowanie wielomodułowych programów
GTK-test - funkcja main
int main( int
argc,char *argv[] )
{
GtkWidget *window;
GtkWidget *box1, *box2;
GtkWidget *button;
GtkWidget *text;
gint
tmp_pos;
gtk_init (&argc, &argv);
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_window_set_title (GTK_WINDOW (window), "GTK - test");
g_signal_connect (G_OBJECT (window), "delete_event",
G_CALLBACK (wyjscie_sys), NULL);
gtk_container_set_border_width (GTK_CONTAINER (window), 10);
Marek Piotrów - Wykład 11
Budowanie wielomodułowych programów
GTK-test pojemnik i przycisk
box1 = gtk_vbox_new (FALSE, 0);
gtk_container_add (GTK_CONTAINER (window), box1);
button = gtk_button_new_with_label ("Kliknij tu");
g_signal_connect (G_OBJECT (button), "clicked",
G_CALLBACK (test_nacisniecia), (gpointer) "Przycisk");
gtk_box_pack_start (GTK_BOX(box1), button, TRUE, TRUE, 0);
gtk_widget_show (button);
text = gtk_entry_new ();
gtk_entry_set_max_length (GTK_ENTRY (text), 50);
g_signal_connect (G_OBJECT (text), "activate",
G_CALLBACK (wprowadzony_tekst),
(gpointer) text);
gtk_entry_set_text (GTK_ENTRY (text), "Wprowadz");
tmp_pos = GTK_ENTRY (text)->text_length;
gtk_editable_insert_text (GTK_EDITABLE (text), " jakis tekst", -1, &tmp_pos);
gtk_editable_select_region (GTK_EDITABLE (text),
0, GTK_ENTRY (text)->text_length);
gtk_box_pack_start (GTK_BOX (box1), text, TRUE, TRUE, 0);
gtk_widget_show (text);
Marek Piotrów - Wykład 11
Budowanie wielomodułowych programów
GTK-test: przycisk ko ´ncz ˛
acy
box2 = gtk_hbox_new (FALSE, 0);
button = gtk_button_new_with_label ("Koniec");
g_signal_connect (G_OBJECT (button), "clicked",
G_CALLBACK (wyjscie_prz), NULL);
gtk_box_pack_start(GTK_BOX (box2), button, TRUE, FALSE, 0);
gtk_box_pack_start(GTK_BOX (box1), box2, TRUE, TRUE, 0);
gtk_widget_show (button);
gtk_widget_show (box2);
gtk_widget_show (box1);
gtk_widget_show (window);
gtk_main ();
return 0;
}
Marek Piotrów - Wykład 11
Budowanie wielomodułowych programów
Narz ˛edzia do budowanie - make i makefile
kalkulator: oblicz2.c stos.c znak.c
gcc stos.c oblicz2.c znak.c -o kalkulator
Marek Piotrów - Wykład 11
Budowanie wielomodułowych programów
Najprostszy makefile
# najprostszy makefile dla programu kalkulator
kalkulator: oblicz2.o stos.o znak.o
gcc stos.o oblicz2.o znak.o -o kalkulator
znak.o: znak.c
gcc -c znak.c -o znak.o
stos.o: stos.c
gcc -c stos.c -o stos.o
oblicz2.o: oblicz2.c
gcc -c oblicz2.c -o oblicz2.o
Marek Piotrów - Wykład 11
Budowanie wielomodułowych programów
Prosty makefile
# prosty makefile dla programu: kalkulator
CFLAGS= -std=c99 -pedantic
# ogolne flagi kompilacji
NAME = kalkulator
$(NAME): oblicz2.o stos.o znak.o
gcc $(CFLAGS) stos.o oblicz2.o znak.o -o $(NAME)
znak.o: znak.c
gcc -c $(CFLAGS) znak.c -o znak.o
stos.o: stos.c
gcc -c $(CFLAGS) stos.c -o stos.o
oblicz2.o: oblicz2.c
gcc -c $(CFLAGS) oblicz2.c -o oblicz2.o
Marek Piotrów - Wykład 11
Budowanie wielomodułowych programów
Typowy makefile
# prosty makefile dla programu: kalkulator
CFLAGS = -std=c99 -pedantic
# ogolne flagi kompilacji dla modulow
LFLAGS = -lm
# ogolne flagi konsolidacji programu
NAME = kalkulator
# nazwa programu wynikowego
SRC = oblicz2.c stos.c znak.c
# nazwy wszystkich plikow zrodlowych
OBJS = oblicz2.o stos.o znak.o
# nazwy wszystkich modulow
YOU : $(SRC) $(NAME)
$(NAME): $(OBJS)
gcc $(CFLAGS) $(OBJS) -o $(NAME) $(LFLAGS)
znak.o: znak.c
gcc -c $(CFLAGS) znak.c -o znak.o
stos.o: stos.c
gcc -c $(CFLAGS) stos.c -o stos.o
oblicz2.o: oblicz2.c
gcc -c $(CFLAGS) oblicz2.c -o oblicz2.o
Marek Piotrów - Wykład 11
Budowanie wielomodułowych programów
Makefile dla Borland’a bcc
# prosty makefile dla programu: kalkulator
CFLAGS =
# ogolne flagi kompilacji dla modulow
LFLAGS =
# ogolne flagi konsolidacji programu
NAME = kalkulator
# nazwa programu wynikowego
SRC = oblicz2.c stos.c znak.c
# nazwy wszystkich plikow zrodlowych
OBJS = oblicz2.obj stos.obj znak.obj
# nazwy wszystkich modulow
YOU : $(SRC) $(NAME)
$(NAME): $(OBJS)
bcc $(CFLAGS) -e$(NAME) $(OBJS) $(LFLAGS)
znak.obj: znak.c
bcc -c $(CFLAGS) -oznak.obj znak.c
stos.obj: stos.c
bcc -c $(CFLAGS) -ostos.obj stos.c
oblicz2.obj: oblicz2.c
bcc -c $(CFLAGS) -ooblicz2.obj oblicz2.c
Marek Piotrów - Wykład 11
Budowanie wielomodułowych programów
Profesjonalny makefile dla Unix
# A bit primitive makefile for Unices
OPTIONS = -DNDEBUG
# OPTIONS = -DPOOR_LIBS -DNDEBUG
# Use the above line if you have problems with compilation due to
# missing declarations. This enables including of "fixes.h", where you
# can place or include what is missing.
# when finished, uncomment -DNDEBUG to remove debugging code
CFLAGS = -s -funsigned-char -O2 # -fno-exceptions
# when finished, add -O2 to CFLAGS
# -fno-exceptions is for gcc 2.8.x
# (I don’t use exceptions -> executable will be smaller)
LFLAGS = -lm # -lstdc++
SRC = euphoria.l euphoria.y symtab.cc symtab.h fixes.h init.cc code.h code.cc \
errors.h seq.cc seq.h
OBJS = symtab.o init.o code.o euphoria.o seq.o
NAME = euphoria
YOU : $(SRC) $(NAME)
Marek Piotrów - Wykład 11
Budowanie wielomodułowych programów
Profesjonalny makefile dla Unix
$(NAME) : $(OBJS)
gcc $(CFLAGS) $(OPTIONS) -o $(NAME) $(OBJS) $(LFLAGS)
lex.yy.c : euphoria.l
flex -s euphoria.l
euphoria.tab.c : euphoria.y
bison euphoria.y
euphoria.o : euphoria.tab.c lex.yy.c
gcc -c $(CFLAGS) $(OPTIONS) -x c++ $< -o $@
%.o : %.cc
gcc -c $(CFLAGS) $(OPTIONS) $< -o $@
clean:
rm -f $(OBJS) $(NAME)
Marek Piotrów - Wykład 11