2011-02-13 6 views
1

Lorsque vous essayez de compiler avec Code :: Blocks l'exemple qui vient avec GTK +:problème avec les bibliothèques liées et GTK +

 
#include stdlib.h 
#include gtk/gtk.h 

static void helloWorld (GtkWidget *wid, GtkWidget *win) 
{ 
    GtkWidget *dialog = NULL; 

    dialog = gtk_message_dialog_new (GTK_WINDOW (win), GTK_DIALOG_MODAL, GTK_MESSAGE_INFO, GTK_BUTTONS_CLOSE, "Hello World!"); 
    gtk_window_set_position (GTK_WINDOW (dialog), GTK_WIN_POS_CENTER); 
    gtk_dialog_run (GTK_DIALOG (dialog)); 
    gtk_widget_destroy (dialog); 
} 

int main (int argc, char *argv[]) 
{ 
    GtkWidget *button = NULL; 
    GtkWidget *win = NULL; 
    GtkWidget *vbox = NULL; 

    /* Initialize GTK+ */ 
    g_log_set_handler ("Gtk", G_LOG_LEVEL_WARNING, (GLogFunc) gtk_false, NULL); 
    gtk_init (&argc, &argv); 
    g_log_set_handler ("Gtk", G_LOG_LEVEL_WARNING, g_log_default_handler, NULL); 

    /* Create the main window */ 
    win = gtk_window_new (GTK_WINDOW_TOPLEVEL); 
    gtk_container_set_border_width (GTK_CONTAINER (win), 8); 
    gtk_window_set_title (GTK_WINDOW (win), "Hello World"); 
    gtk_window_set_position (GTK_WINDOW (win), GTK_WIN_POS_CENTER); 
    gtk_widget_realize (win); 
    g_signal_connect (win, "destroy", gtk_main_quit, NULL); 

    /* Create a vertical box with buttons */ 
    vbox = gtk_vbox_new (TRUE, 6); 
    gtk_container_add (GTK_CONTAINER (win), vbox); 

    button = gtk_button_new_from_stock (GTK_STOCK_DIALOG_INFO); 
    g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (helloWorld), (gpointer) win); 
    gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0); 

    button = gtk_button_new_from_stock (GTK_STOCK_CLOSE); 
    g_signal_connect (button, "clicked", gtk_main_quit, NULL); 
    gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0); 

    /* Enter the main loop */ 
    gtk_widget_show_all (win); 
    gtk_main(); 
    return 0; 
} 

Je reçois les erreurs suivantes:

 
ld.exe||cannot find -lgobject-2.0| 
ld.exe||cannot find -lglib-2.0| 
||=== Build finished: 2 errors, 0 warnings ===| 

Je liés à la fois au projet, mais je ne peux pas trouver un moyen de le faire fonctionner. J'ai essayé les deux paquets groupés et séparés de http://www.gtk.org/download-windows.html. Je suis sûr que ça doit être quelque chose de simple/stupide mais je n'ai rien trouvé qui puisse m'aider à résoudre ce problème.

+0

Comment construisez-vous votre code? Quelle est la commande que vous utilisez? – chrisaycock

+0

Même si je l'ai déjà trouvé, où puis-je trouver la commande de construction complète dans Code :: Blocks? – Filgera

+0

peut être utiliser faire un fichier pour compiler votre projet? –

Répondre

2

Avez-vous ajouté le répertoire GTK contenant les fichiers libglib-2.0.a, libgobject-2.0.a aux répertoires de recherche du lissoir? Cela peut être fait à partir du chemin suivant:
Settings | Compiler and debugger... | Search directories | Linker | Add.

La ligne de commande complète pour le compilateur/éditeur de liens peut être affichée dans la fenêtre Build Log. Pour activer ce rendez-vous à:
Settings | Compiler and debugger... | Other Settings | Compiler logging | Full command line

Je ne suis pas venu sur la question du point d'entrée manquant alors peut-être votre copie de GTK est corrompu. Télécharger le paquet tout-en-un de GTK+ 2.22

assurez-vous d'ajouter tous les répertoires inclure dans Search directories | Compiler

En marge, vous devrez peut-être compiler votre projet à l'aide -mms-bitfields qui peut être ajouté dans: Settings | Compiler and debugger... | Other options il suffit de coller le drapeau tel quel.

+0

Cela semble avoir fonctionné. Mais je ne comprends pas pourquoi j'ai besoin de mettre le répertoire quand j'inclus le chemin complet de la lib sur l'éditeur de liens lui-même? De plus, j'ai un nouveau problème lors de l'exécution de l'exécutable fini et je ne suis pas sûr si c'est lié à cela. "Impossible de trouver le point d'entrée de la procédure g_bsearch_array_destroy dans la DLL libglib-2.0.0." Merci pour l'aide edit: oublié de mentionner que j'ai inclus toutes les DLL nécessaires. – Filgera

+0

J'ai essayé de créer un lien vers les fichiers .lib à partir du fichier blindé, et j'ai utilisé la DLL fournie pour ne pas avoir de chance. Merci pour l'aide. Je vais essayer de trouver un moyen. – Filgera

0

Lorsque le code :: blocks est en cours d'exécution ld.exe au lieu de l'appeler, par exemple: -l glib-2.0 il appelle avec -lglib-2.0

Ajout d'un espace avant le nom de lib dans le code :: options de l'éditeur de liens de bloc devraient fixer il.

Questions connexes