Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

DeKugelschieber

Community-Fossil

  • »DeKugelschieber« ist der Autor dieses Themas

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

1

10.02.2014, 18:15

GTK Signalhandler (extern "C")

Hallo,

ich hab gerade ein "Problem" das ich nicht verstehe, bzw. nicht haben möchte.
Und zwar muss ich (GTK3) komischerweise an diesen Handler:

C-/C++-Quelltext

1
2
3
extern "C" void paul(GtkWidget* widget, gpointer data){ // ja heißt paul... (Test)
    std::cout<<"open settings..."<<std::endl;
}


extern "C" anhängen damit GTK ihn findet, aber an diesen nicht:

C-/C++-Quelltext

1
2
3
void exit(GtkWidget* widget, gpointer data){
    gtk_main_quit();
}


Das stört mich, ich möchte kein hässliches extern "C" davor haben und gerne verstehen warum es unten geht.
Aufgesetzt wird das Fenster wie folgt:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int main(int argc, char** args){
    gtk_init(&argc, &args);

    GtkBuilder* builder = gtk_builder_new();
    gtk_builder_add_from_file(builder, "res/UI.glade", 0);

    gtk_builder_connect_signals(builder, 0);

    GtkWidget* window = GTK_WIDGET(gtk_builder_get_object(builder, "mainWindow"));
    gtk_widget_show(window);

    gtk_main();

    return 0;
}


Das UI selbst wurde in Glade gebaut. Nichts spektakuläres bis jetzt, nur ein Fenster mit Hauptmenü + zwei Einträge dort.
Kompiliert wird mit pkg-config (unter Linux) und sonst nix:

Quellcode

1
`pkg-config --cflags --libs gtk+-3.0 gmodule-2.0` -export-dynamic


Hat irgendwer rat? Sonst mach ich erstmal weiter, aber wäre schön das zu wissen :)

[Edit]

Außerdem werden Funktionen wie gtk_window_close() nicht gefunden?

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »DeKugelschieber« (10.02.2014, 19:28)


2

16.02.2014, 23:44

Das hat mit der Verlinkung der Funktionen zu tun. Wenn der Compiler die Objekt-Datei für deine C oder C++ ausspuckt muss er sich entscheiden wie die Funktion aufgerufen wird, die kann sich unterscheiden.

So kann zum Beispiel eine C++ funtion __myFunc heißen oder __mNamespace##myFunc, die Benennungsstrategie wird "Name mangling" genannt und ist nicht standardisiert. Verlinkung im C Stil hingegen hat einen Standard und kann sowohl von C als auch von C++ genutzt werden.

Die Inkonsistenz kann alleine durch die Benennung der Datei zustande kommen. Viele compiler behandeln *.c Dateien automatisch mit C Verlinkung und C++ Dateien mit C++ Verlinkung.

Dies wird häufig mit Präprozessor Macros ein wenig "verschönert". Alternativ, kannst du das auch in Blöcken definieren:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#ifdef __cplusplus
extern "C" { 
#endif

void myFunc();
int myFunc2(int);
...
...
...


#ifdef __cplusplus
}
#endif

DeKugelschieber

Community-Fossil

  • »DeKugelschieber« ist der Autor dieses Themas

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

3

17.02.2014, 00:02

Ah vielen Dank :) Lang ersehnte Antwort.
Das mit den Blöcken ist gut, macht das ganze etwas schicker.

Das Problem dass ich unten hinzugefügt hatte hat sich übrigens erledigt (nutze jetzt gtkmm und dort dann mit window->hide() das Fenster "schließen").

Werbeanzeige