Barra laterale

programmazione:msys2:distribuire_applicazioni_gtk3

Distribuire applicazioni Gtk+-3.x con MSYS2

Autore: Fabio Di Matteo
Ultima revisione: 10/02/2017 - 10:54

MSYS2 è una distribuzione software e piattaforma di sviluppo per Windows. Tramite Msys2 è possibile installare su windows un'ambiente di “tipo Unix” con bash, gcc, e tutti gli altri strumenti e librerie tipiche di questo ambiente.
Sara' così abbastanza comodo fare il porting delle nostre applicazioni per GNU/Linux.

Installiamo le dipendenze

Avviamo dal menu di windows MSYS2 mingw 32 bit o 64 bit. Per compilare le nostre applicazioni Gtk si devono installare le dipendenze necessarie su msys2. Per far questo si usa pacman:

pacman -S mingw-w64-i686-gtk3 make gcc 

Fatto cio' dovremmo gia' avere tutto l'occorrente per compilare la nostra app.

La nostra applicazioni di prova

main.c

#include <gtk/gtk.h>
 
 
void
info_message(GtkWidget *main_window,gchar* title, gchar *msg, gchar* winlabel)
{
	GtkWidget *dialog;
	title=g_strdup_printf("<span size=\"x-large\"><b>%s</b></span>", title);
 
  	dialog = gtk_message_dialog_new_with_markup (GTK_WINDOW (main_window),
				   GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
				   GTK_MESSAGE_INFO,
				   GTK_BUTTONS_OK,
				   title);
	gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(dialog),
					"%s",(gchar *)msg);
	gtk_window_set_title(GTK_WINDOW(dialog),winlabel);
  	gtk_dialog_run (GTK_DIALOG (dialog));
  	gtk_widget_destroy (dialog);
}
 
 
gint
info_YesNo(GtkWidget *main_window,gchar* title, gchar *msg, gchar* winlabel)
{
  GtkWidget *dialog;
  gint result;
  title=g_strdup_printf("<span size=\"x-large\"><b>%s</b></span>", title);
 
  	dialog = gtk_message_dialog_new_with_markup (GTK_WINDOW (main_window),
				   GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
				   GTK_MESSAGE_WARNING,
				   GTK_BUTTONS_YES_NO,
				   title);
	gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(dialog),
					"%s",(gchar *)msg);
	gtk_window_set_title(GTK_WINDOW(dialog),winlabel);
  	result = gtk_dialog_run (GTK_DIALOG (dialog));
	switch (result)
    {
      case GTK_RESPONSE_YES:
         result=GTK_RESPONSE_YES ;
		 break;
	  case GTK_RESPONSE_NO:
         result=GTK_RESPONSE_NO ;
		 break;	 
 
      default:
         result=GTK_RESPONSE_DELETE_EVENT;
         break;
    }
  	gtk_widget_destroy (dialog);
	return result;
 
}
 
void
err_message(GtkWidget *main_window,gchar* title, gchar *msg, gchar* winlabel)
{
	GtkWidget *dialog;
	title=g_strdup_printf("<span size=\"x-large\"><b>%s</b></span>", title);
 
	dialog = gtk_message_dialog_new_with_markup (GTK_WINDOW (main_window),
				   GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
				   GTK_MESSAGE_ERROR,
				   GTK_BUTTONS_OK,title);
  gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(dialog),
    												"%s",(gchar *)msg);
  gtk_window_set_title(GTK_WINDOW(dialog),winlabel);
  gtk_dialog_run (GTK_DIALOG (dialog));
  gtk_widget_destroy (dialog);
}
 
 
static void
print_hello (GtkWidget *widget,
             gpointer   data)
{
  g_print ("Hello World\n");
 
	gchar* txt="Buon giorno a tutti";
 
 
 
  info_message(NULL,"Ciao",txt, "Ciao Mondo!");
 
}
 
static void
activate (GtkApplication *app,
          gpointer        user_data)
{
  GtkWidget *window;
  GtkWidget *button;
  GtkWidget *button_box;
 
  window = gtk_application_window_new (app);
  gtk_window_set_title (GTK_WINDOW (window), "Window");
  gtk_window_set_default_size (GTK_WINDOW (window), 200, 200);
 
  button_box = gtk_button_box_new (GTK_ORIENTATION_HORIZONTAL);
  gtk_container_add (GTK_CONTAINER (window), button_box);
 
  button = gtk_button_new_with_label ("Hello World");
  g_signal_connect (button, "clicked", G_CALLBACK (print_hello), NULL);
  //g_signal_connect_swapped (button, "clicked", G_CALLBACK (gtk_widget_destroy), window);
  gtk_container_add (GTK_CONTAINER (button_box), button);
 
  gtk_widget_show_all (window);
}
 
int
main (int    argc,
      char **argv)
{
  GtkApplication *app;
  int status;
 
  app = gtk_application_new ("org.gtk.example", G_APPLICATION_FLAGS_NONE);
  g_signal_connect (app, "activate", G_CALLBACK (activate), NULL);
  status = g_application_run (G_APPLICATION (app), argc, argv);
  g_object_unref (app);
 
  return status;
}

makefile

all:
	gcc  -o TEST.exe main.c `pkg-config --cflags --libs gtk+-3.0` -mwindows -mms-bitfields

Adesso compiliamo con make ed eseguiamo con ./TEST

Distribuire il nostro programma

Per far si che il nostro programma si avvii' correttamente anche al di fuori di MSYS2 in computer dove non è mai stato installato MSYS2 doppiamo creare una cartella con dentro il nostro programma e tutte le dipendenze dello stesso. Procediamo lanciando il comando

ldd TEST.exe 

che mostrera' l'elenco delle librerie dinamiche alle quali è collegato il nostro eseguibile. Non ci resta che copiare tutte queste librerie ,escluse quelle contenute in /c/windows e altri percorsi esterni a MSYS2, nella nostra cartella.

Ecco come apparitra' la nostra cartella :

drwxr-xr-x 1 Admin       0 10 feb 08.37 etc
drwxr-xr-x 1 Admin       0 10 feb 09.20 share
-rwxr-xr-x 1 Admin   95046 10 feb 08.16 zlib1.dll
-rwxr-xr-x 1 Admin   59931 10 feb 08.33 TEST.exe
-rwxr-xr-x 1 Admin  110334 10 feb 08.25 msys-gcc_s-1.dll
-rwxr-xr-x 1 Admin 3432037 10 feb 08.26 msys-2.0.dll
-rwxr-xr-x 1 Admin   65181 10 feb 08.12 libwinpthread-1.dll
-rwxr-xr-x 1 Admin 1544989 10 feb 08.21 libstdc++-6.dll
-rwxr-xr-x 1 Admin  249805 10 feb 08.21 libpng16-16.dll
-rwxr-xr-x 1 Admin  706136 10 feb 08.22 libpixman-1-0.dll
-rwxr-xr-x 1 Admin  287661 10 feb 08.15 libpcre-1.dll
-rwxr-xr-x 1 Admin  101544 10 feb 08.24 libpangowin32-1.0-0.dll
-rwxr-xr-x 1 Admin   92019 10 feb 08.24 libpangoft2-1.0-0.dll
-rwxr-xr-x 1 Admin   64724 10 feb 08.24 libpangocairo-1.0-0.dll
-rwxr-xr-x 1 Admin  259014 10 feb 08.23 libpango-1.0-0.dll
-rwxr-xr-x 1 Admin  140201 10 feb 08.14 libintl-8.dll
-rwxr-xr-x 1 Admin 1055929 10 feb 08.14 libiconv-2.dll
-rwxr-xr-x 1 Admin  424567 10 feb 08.20 libharfbuzz-0.dll
-rwxr-xr-x 1 Admin 7358678 10 feb 08.17 libgtk-3-0.dll
-rwxr-xr-x 1 Admin  237080 10 feb 08.21 libgraphite2.dll
-rwxr-xr-x 1 Admin  337171 10 feb 08.15 libgobject-2.0-0.dll
-rwxr-xr-x 1 Admin   26562 10 feb 08.11 libgmodule-2.0-0.dll
-rwxr-xr-x 1 Admin 1222159 10 feb 08.11 libglib-2.0-0.dll
-rwxr-xr-x 1 Admin 1606715 10 feb 08.10 libgio-2.0-0.dll
-rwxr-xr-x 1 Admin 1258774 10 feb 08.17 libgdk-3-0.dll
-rwxr-xr-x 1 Admin  182124 10 feb 08.22 libgdk_pixbuf-2.0-0.dll
-rwxr-xr-x 1 Admin  122036 10 feb 08.14 libgcc_s_dw2-1.dll
-rwxr-xr-x 1 Admin  677515 10 feb 08.19 libfreetype-6.dll
-rwxr-xr-x 1 Admin  330911 10 feb 08.18 libfontconfig-1.dll
-rwxr-xr-x 1 Admin   34874 10 feb 08.16 libffi-6.dll
-rwxr-xr-x 1 Admin  172915 10 feb 08.19 libexpat-1.dll
-rwxr-xr-x 1 Admin 1687656 10 feb 08.22 libepoxy-0.dll
-rwxr-xr-x 1 Admin   34476 10 feb 08.18 libcairo-gobject-2.dll
-rwxr-xr-x 1 Admin 1083946 10 feb 08.18 libcairo-2.dll
-rwxr-xr-x 1 Admin   76571 10 feb 08.20 libbz2-1.dll
-rwxr-xr-x 1 Admin  142619 10 feb 08.25 libatk-1.0-0.dll

Copiare icone

Per rendere piu' accattivante la nostra applicazione possiamo copiare la cartella delle icone da C:\msys32\mingw32\share\icons\Adwaita\ a [percorso di TEST.exe]\share\icons\

Abilitare i temi

Potremmo anche avere bisogno di abilitare i temi o magari aggiungerne altri. Per far cio' creiamo il file [percorso di TEST.exe]\etc\gtk-3.0\settings.ini . Se vogliamo abilitare il tema built-in win32 basta aggiungere a settings il seguente contenuto:

[Settings]
gtk-theme-name=win32

programmazione/msys2/distribuire_applicazioni_gtk3.txt · Ultima modifica: 18/04/2018 - 15:48 (modifica esterna)