PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [C] Wie unter Win Kompilieren? Header falsch?



crocodilechris
04-10-2010, 20:56
Hallo,
ich hab bisher C nur unter Unix/Linux kompiliert.
Hab jetzt nen Projekt mit gtk+ realisiert und wollte das unter Windows kompilieren, was mich vor einige Probleme stellte.

Als Kompiler hab ich jetzt MinGW genommen.

Wenn ich das Projekt (siehe Anhang) kompilieren will, erhalte ich nicht die gewünschte Funktionalität:

gcc SSP_main.c -o SSP.exe `pkg-config --cflags --libs gtk+-2.0 gmodule-2.0`Dies kompiliert zwar, aber beim Aufruf der EXE erhalte ich die Oberfläche und ne Konsole mit der Nachricht:
(SSP.exe:2240): Gtk-WARNING **: Could not find signal handler 'on_button1_clicked'

Wenn ich die Funktionalität der random.h haben will, dann bekomme ich beim kompilieren die Warnung der "Impliziten Definition der Funktion", deswegen hab ich das erstmal auskommentiert.

Wenn ich erst die Objektdateien erzeuge und diese dann mittels
gcc `pkg-config --cflags --libs gtk+-2.0 gmodule-2.0` SSP_main.o SSP_callback.o -o SSP.exelinken will, dann bekomme ich "undefined reference to '$gtk_FUNKTION'.

Sind meine Header falsch? Sind meine ersten ...
Oder liegt der Fehler beim Linken?

Danke für eure Hilfe.

crocodilechris
14-10-2010, 16:33
Kann mir keiner helfen, oder habe ich Etwas falsch gemacht beim Posten?
Hätte ich die Quellen vlt in ner Codebox posten sollen, anstatt nen Archiv zu packen?

Ich komm beim besten Willen nicht dahinter, warum das nicht kompilieren will. :(

pkg-config liefert unter MinGW:


Chris@Terrarium_lap /d/Studium/GUI Sammlung/C/Schere_Stein_Papier
$ pkg-config --cflags gtk+-2.0
-mms-bitfields -Ic:/opt/gtk/include/gtk-2.0 -Ic:/opt/gtk/lib/gtk-2.0/include -Ic:/opt/gtk/include/atk-1.0 -Ic:/opt/gtk/include/cairo -Ic:/opt/gtk/include/pango-1.0 -Ic:/opt/gtk/include/glib-2.0 -Ic:/opt/gtk/lib/glib-2.0/include -Ic:/opt/gtk/include -Ic:/opt/gtk/include/freetype2 -Ic:/opt/gtk/include/libpng14

Chris@Terrarium_lap /d/Studium/GUI Sammlung/C/Schere_Stein_Papier
$ pkg-config --cflags gmodule-2.0
-mms-bitfields -Ic:/opt/gtk/include/glib-2.0 -Ic:/opt/gtk/lib/glib-2.0/include


Chris@Terrarium_lap /d/Studium/GUI Sammlung/C/Schere_Stein_Papier
$ pkg-config --libs gtk+-2.0
-Lc:/opt/gtk/lib -lgtk-win32-2.0 -lgdk-win32-2.0 -latk-1.0 -lgio-2.0 -lgdk_pixbuf-2.0 -lpangowin32-1.0 -lgdi32 -lpangocairo-1.0 -lpango-1.0 -lcairo -lgobject-2.0 -lgmodule-2.0 -lgthread-2.0 -lglib-2.0 -lintl

Chris@Terrarium_lap /d/Studium/GUI Sammlung/C/Schere_Stein_Papier
$ pkg-config --libs gmodule-2.0
-Lc:/opt/gtk/lib -lgmodule-2.0 -lglib-2.0 -lintl

Die Daten bei den cflags sind richtig und vorhanden, ich versteh nicht, warum die Funktionen nicht gefunden werden. :(
Hab es sogar schon mit
$ gcc `pkg-config --cflags gtk+-2.0 gmodule-2.0 | sed -e 's/Ic:/I\/c/g'` versucht, weil unter MinGW die Pfade nicht c:/opt sondern /c/opt sind.

undefined
14-10-2010, 17:15
Ist die unter Win verwendete GTK Version die gleiche wie beim bisher verwendeten Linux Projekt?

sommerfee
14-10-2010, 19:24
Ich meine mal irgendwie irgendwo irgendwann gelesen zu haben, daß es Probleme mit libglade unter Windows gibt. Vielleicht hilft eine Recherche in diese Richtung weiter.

(Sorry für den schwammigen Beitrag, ich selber verwende kein libglade.)

crocodilechris
15-10-2010, 12:17
Ist die unter Win verwendete GTK Version die gleiche wie beim bisher verwendeten Linux Projekt?
Linux: 2.16
Windows: 2.20

@sommerfee
besser schwammig, als garkeine Reaktion. Ich werd mal in diese Richtung recherchieren.

sommerfee
15-10-2010, 18:54
Bekommst du eigentlich GTK-Quelltexte übersetzt, die kein (lib)glade verwenden, also z.B.


#include <gtk/gtk.h>

int main( int argc, char *argv[])
{
gtk_init( &argc, &argv );
gtk_widget_show( gtk_window_new( GTK_WINDOW_TOPLEVEL ) );
gtk_main();
return 0;
}

crocodilechris
17-10-2010, 11:42
Das Funktioniert.
Dann hab ich auchnoch versucht meine GUI zu kompilieren: das Funktioniert auch.
/* SSP_main.c */
#define GLADE_FILE "SSP.glade"

#include <gtk/gtk.h>

int main( int argc, char ** argv ) {
GtkBuilder *builder;
GError *error = NULL;
GtkWidget *window;


/* init Gtk */
gtk_init( &argc, &argv );

/* Create new GtkBuilder object */
builder = gtk_builder_new();
/* Load UI from file. If error occurs, report it and quit application. */
if ( ! gtk_builder_add_from_file( builder, GLADE_FILE, &error ) ) {
g_warning( "%s", error->message );
g_free( error );
return( 1 );
}

/* Get main window pointer from UI */
window = GTK_WIDGET( gtk_builder_get_object( builder, "window1" ) );

/* Connect signals */
gtk_builder_connect_signals( builder, NULL );

/* Signal connect example
g_signal_connect( G_OBJECT( button1 ), "clicked", G_CALLBACK(on_button1_clicked), radio_list);
*/

/* Destroy builder, since we don't need it anymore */
g_object_unref( G_OBJECT( builder ) );

/* Show window. All other widgets are automatically shown by GtkBuilder */
gtk_widget_show( window );

/* Start main loop */
gtk_main();

return( 0 );
}
Ich werde dann jetzt mal versuchen das Problem Schritt-für-Schritt zu reproduzieren.
Mir ist auch gerade aufgefallen, dass ich meine callbacks nirgendwo inkludiere...

crocodilechris
18-10-2010, 23:42
So, hab das Problem gelöst.
Konnte es aber leider nicht vollständig reproduzieren. :(

Bei den Callbacks musste ich beim kompilieren die Libs übergeben damit diese korrekt übersetzt wurden. Zusätzlich habe ich das static entfernt und nen Header mit den Forward deklarationen erstellt und diese als extern deklariert, da es mit static später Probleme gab, als ich die random.h hinzugefügt habe.