FLTK mit Stroustrup interface Library Problem



  • Hallo zusammen,
    vielleicht ist das Buch Programming: Principles and Practise using C++ hier ein Begriff. Ich befinde mich aktuell im Kapitel 12, da geht es mit GUI Programmierung mit FLTK und C++ los. Stroustrup stellt dafür extra eine interface Library zur Verfügung welche aus einer Hand voll Header- und cpp-Dateien besteht, zur Verfügung. Sinn derselben ist es, sich nicht mit den ganzen Internas von FLTK zu beschäftigen, sondern Programmierkonzepte zu erlernen.

    Seit Tagen versuche ich nun diese Interface Libraries zum Laufen zu bringen, aber es klappt nicht. FLTK ohne die Stroustrup-Dateien (also die interface Library) funktioniert dagegen einwandfrei.

    Ich verwende Visual Studio Community 2019, folgende Fehlermeldung erhalte ich wenn ich den Projektordner erstellen will (Achtung jetzt kommen 3 lange Fehlermeldungen):

    Fehlermeldung 1
    1>GUI.obj : error LNK2005: "class std::mersenne_twister_engine<unsigned int,...Zahlengewirr entfernt...> & __cdecl get_rand(void)" (?get_rand@@YAAAV?$mersenne_twister_engine@I$0CA@$0CHA@$0BIN@$0BP@$0JJAILANP@$0L@$0PPPPPPPP@$06$0JNCMFGIA@$0P@$0OPMGAAAA@$0BC@$0GMAHIJGF@@std@@XZ) ist bereits in Graph.obj definiert.

    1>GUI.obj : error LNK2005: "void __cdecl seed_randint(int)" (?seed_randint@@YAXH@Z) ist bereits in Graph.obj definiert.

    Fehlermeldung 2
    1>main.obj : error LNK2005: "class std::mersenne_twister_engine<unsigned int,...Zahlengewirr entfernt...> & __cdecl get_rand(void)" (?get_rand@@YAAAV?$mersenne_twister_engine@I$0CA@$0CHA@$0BIN@$0BP@$0JJAILANP@$0L@$0PPPPPPPP@$06$0JNCMFGIA@$0P@$0OPMGAAAA@$0BC@$0GMAHIJGF@@std@@XZ) ist bereits in Graph.obj definiert.

    1>main.obj : error LNK2005: "void __cdecl seed_randint(int)" (?seed_randint@@YAXH@Z) ist bereits in Graph.obj definiert.

    Fehlermeldung 3
    1>Window.obj : error LNK2005: "class std::mersenne_twister_engine<unsigned int,...Zahlengewirr entfernt...> & __cdecl get_rand(void)" (?get_rand@@YAAAV?$mersenne_twister_engine@I$0CA@$0CHA@$0BIN@$0BP@$0JJAILANP@$0L@$0PPPPPPPP@$06$0JNCMFGIA@$0P@$0OPMGAAAA@$0BC@$0GMAHIJGF@@std@@XZ) ist bereits in Graph.obj definiert.

    1>Window.obj : error LNK2005: "void __cdecl seed_randint(int)" (?seed_randint@@YAXH@Z) ist bereits in Graph.obj definiert.

    Fehlermeldungen Ende

    Ich bin Ratlos und kann damit überhaupt nichts anfangen. Was kann das bedeuten und wie kann ich es beheben?



  • Es sieht so aus als hätte er einige inline-Deklarationen vergessen. In std_lib_facilities.h steht irgendwo

    default_random_engine& get_rand()
    {
    	static default_random_engine ran;
    	return ran;
    };
    
    void seed_randint(int s) { get_rand().seed(s); }
    

    Du hast ein Problem mit der ersten davon, aber die zweite ist auch falsch. Beide Definitionen müssen mit inline versehen werden.



  • @Bashar
    Danke vielmals, das war es !! Habe beides mit inline versehen und jetzt geht es.
    Wenn du um die Ecke wohnen würdest, hätte ich dir nen Kasten Bier spendiert, so muss es halt bei einem Danke bleiben 🙂
    Woran hast du erkannt, dass inline hingehört? Ich als Neuling wäre niemals darauf gekommen.



  • Das liegt bei Mehrfachdefinitionen einfach nahe. Es kann natürlich sein, dass die Funktion einfach so in mehreren Quelldateien definiert ist, aber wahrscheinlicher ist, dass sie in einem Header steht. Und da Header üblicherweise in mehreren Quelldateien eingebunden werden, muss man in Hinblick auf die One-Definition-Rule aufpassen. Typdefinitionen sind OK, auch mit darin definierten Memberfunktionen. Templates sind OK. Variablendefinitionen und Funktionen sind problematisch, außer sie sind inline. Man hätte die beiden Funktionen auch in eine Quelldatei verschieben können, aber die lib_std_facilities.h hat anscheinend kein cpp-Pendant, also eben inline.

    So die Kurzzusammenfassung, das steht sicher nochmal besser anderswo, z.B. bei Stroustrup oder Meyers.

    PS ich hab natürlich auch gegoogelt und eine Stackoverflow-Antwort gefunden. Die hätte ich verlinkt, aber sie ließ qualitativ einiges zu wünschen übrig.



  • @Bashar sagte in FLTK mit Stroustrup interface Library Problem:

    So die Kurzzusammenfassung, das steht sicher nochmal besser anderswo, z.B. bei Stroustrup oder Meyers.

    Anscheinend weiß es Bjarne aber auch nicht. 🙂



  • @Bashar sagte in FLTK mit Stroustrup interface Library Problem:

    Variablendefinitionen und Funktionen sind problematisch, außer sie sind inline. Man hätte die beiden Funktionen auch in eine Quelldatei verschieben können, aber die lib_std_facilities.h hat anscheinend kein cpp-Pendant, also eben inline.

    Das ist was für den Merkzettel, habe mit Inline noch nichts zu tun gehab bisher.

    Du sprichst Bücher an, ich würde mein Wissen gerne vertiefen, wäre das was du empfehlen kannst?
    Effective Modern C++: 42 Specific Ways to Improve Your Use of C++11 and C++14
    Bücher von Meyers haben einen guten Ruf.



  • @ellas Ich habe gerade keinen Zugriff auf das Buch, aber soweit ich mich erinnere, fängt "Effective Modern C++" damit an, ausführlich die Typdeduktionsregeln für Templates, auto und decltype zu behandeln. Das ist nichts, was ich unbedingt jeden Tag brauche.... Ansonsten muss ich nach dem Inhaltsverzeichnis gehen. Mir erscheint es als ein Buch für jemanden, der im Prinzip C++03 richtig gut kann, aber ein Update für die mit C++11 (und 14) neu eingeführten Features braucht, insbesondere da diese zum Teil auch einen anderen Programmierstil mit sich bringen.


  • Banned

    This post is deleted!

Log in to reply