Projektabhängigkeiten



  • Hallo,
    ich spiele gerade mit Projektabhängigkeiten in Visual Studio 2013 herum. Zum Test wollte ich mal using namespace Test; kompilieren lassen. Er bringt mir dann die Meldung, dass Test kein Namespace ist. Ich habe die Projektabhängigkeit gesetzt und das andere Projekt als Verweis hinzugefügt. Was habe ich vergessen?

    mit freundlichen Grüßen

    Hindi


  • Mod

    Die Header Datei.

    Die Projekte untereinander haben so mal nichts miteinander zu tun.

    Das ist nicht die .NET Welt. In C++ muss alles deklariert und definiert werden.



  • Ja aber könnte der Kompiler sich nicht die Adressen der Funktionen aus den andere Projekten merken und dann bei den anderen Projekten einfügen? So dachte ich mir das.

    Was meinst du mit Headern? In den Headern steht ja nur drin, wie die Deklarationen aussehen, wenn mein Gedanke nicht funktioniert, wie soll dann das funktionieren?



  • bzw. wie genau bekomme ich da jetzt eine richtige Abhängigkeit untereinander her?


  • Mod

    Nein. Die Verbindung von Projekten geschieht über statische Libraries oder DLLs.

    In beiden Fällen werden die Header Dateien im Zielprojekt venötigt. Die entsprechende Lib wird automatisch in die Linker Optionen des Zielprojektes hinzugefügt.



  • Hindi schrieb:

    Ja aber könnte der Kompiler sich nicht die Adressen der Funktionen aus den andere Projekten merken und dann bei den anderen Projekten einfügen? So dachte ich mir das.

    Das - bzw. genauer: das was in Wirklichkeit passiert, aber inetwa dem enspricht was du beschreibst - ist Aufgabe des Linkers.

    Trotzdem musst du alles was du in C++ verwenden willst in jedem einzelnen Source-File erstmal deklarieren.
    Also wenn du wo die Funktion Foo aufrufen willst, dann muss irgendwo stehen:

    void Foo();
    

    Davor ist keine Funktion mit diesem Namen "bekannt", und daher lässt der Compiler dich die Funktion auch nicht aufrufen. Mit Klassen, Variablen, Namespaces etc. ist es das selbe. Bevor sie verwendet werden können, müssen sie deklariert werden.

    Was meinst du mit Headern? In den Headern steht ja nur drin, wie die Deklarationen aussehen, wenn mein Gedanke nicht funktioniert, wie soll dann das funktionieren?

    Dein Gedankte funktioniert ja so inetwa.
    Nur dass das Übersetzungsmodell von C++ ein ganz anderes ist, als z.B. das von C# oder Java.
    Bei C++ kannst du jedes Source-File einzeln compilieren, in beliebiger Reihenfolge. Und erst zum Schluss wird alles zusammengelinkt. Daher kann der Compiler sich auch nichts "merken".

    Wenn du z.B. das Foo-verwendende File als erstes kompilierst -- woher soll der Compiler dann wissen dass es überhaupt eine Funktion Foo gibt, bzw. wie die Parameter von Foo aussehen?
    => Kann er nicht => Du musst das Header-File einbinden wo Foo() deklariert wird.
    Danach kannst du das File kompilieren wo Foo definiert (implementiert) wird.
    Und danach kannst du dann alles zusammenlinken.
    Der Linker hat dann alles auf einmal zur Verfügung, und kann alles "verbinden" (engl. "to link").

    Davon abgesehen: klar hätte man vieles anders machen können. "Könnte der Compiler nicht" ist aber keine praktisch sinnvolle Überlegung. Der Compiler könnte vieles anders machen. Nur wenn im C++ Standard eine Sache vorgeschrieben ist, dann darf er es nicht anders machen.



  • Danke für eine Antworten, das hat mir schon etwas geholfen, allerdings bin ich noch immer nicht so ganz auf dem richtigen Weg habe ich das Gefühl^^.
    http://www.loaditup.de/files/810158_c3dt3afmrm.png
    (ScGame ist im Projektordner TacticsScene und die Main.cpp ist im Projektordner Tactics. Im Header ExternalHeaders.h sind immer jeweils alle Header aufgelistet, welche aus anderen Projektordner inkludiert werden müssen (z.B.:

    #include "../TacticsManager/Manager.h"
    #include "../TacticsScene/ScGame.h"
    

    ))
    VS linkt offensichtlich irgendwas nicht richtig, das komische ist nur, dass

    Tactics::Manager::Settings* settings = Tactics::Manager::Manager::getSettings();
    	sf::RenderWindow window(sf::VideoMode(settings->getScreenWidth(), settings->getScreenHeight()), "SFML works!");
    

    so funktioniert wie es soll, bei:

    Tactics::Scene::ScGame* sceneGame = new Tactics::Scene::ScGame();
    

    schmiert VS aber ab.
    Bei den Projektabhängigkeiten für Tactics habe ich für jedes andere Projekt einen Haken drin. Somit müsste VS ja alles richtig linken und den Projektordner Tactics als letztes kompilieren (was eigentlich auch egal ist, da ich ja die ganzen Header der anderen Projektordner auch inkludiere).
    Tactics ist logischer weiße eine exe mit der main-Funktion welche im Bild zu sehen ist. Die anderen Projektordner kompiliere ich als .lib-Dateien (damit will ich bezwecken, dass diese gleich statisch gelinkt werden, was ich gerade erwähne, weil ich mir nicht 100% sicher bin, dass dies auch so funktioniert)).

    Weiß jemand was?



  • Hier habe ich noch die ScGame.cpp:
    http://www.loaditup.de/files/810162_v4bs6y9nrq.png



  • Du gibst dir Mühe dein Setup zu beschreiben. Das ist gut!
    Aber die Fehlerbeschreibung ... "VS schmiert ab" ... => nicht so gut.
    Was genau heisst das?
    Die IDE selbst crasht? Der Compiler crasht beim kompilieren? Dein Programm crasht wenn du es ausführst? Welcher Crash (wie sieht die Fehlermeldung aus)?



  • Sorry habe ich vergessen zu erwähnen^^: Der Fehler ist auf meinem ersten Screenshot zu sehen.



  • Man, ich sollte mich endlich anmelden -
    Es lässt sich auch alles richtig kompilieren, eben nur bis ich

    Tactics::Scene::ScGame* sceneGame = new Tactics::Scene::ScGame()
    

    aufrufe.
    Das komische dabei ist, dass

    Tactics::Manager::Settings* settings = Tactics::Manager::Manager::getSettings();
        sf::RenderWindow window(sf::VideoMode(settings->getScreenWidth(), settings->getScreenHeight()), "SFML works!");
    

    auch ein externer Aufruf ist, aber funktioniert.



  • Dann machst du vermutlich irgendwas im TacticsScene Projekt (wo es nicht funktioniert) anders als im TacticsManager Projekt (wo es schon funktioniert).
    Check nochmal die Projekt-Typen (alles statische LIB?) und Projekteinstellungen.
    Und die Dependencies.

    Oder lade die ganze Solution irgendwo hoch, dann sieht es sich vielleicht jmd. an (ich z.B., wenn ich nicht vergesse wieder in den Thread reinzugucken ;)).

    ps: und gewöhn dir an Linker Fehler als Linker Fehler zu bezeichnen, und nicht als "VS schmiert ab".



  • Hier das ganze Projekt:
    http://www.file-upload.net/download-8753115/Tactics.rar.html
    Dieses Projekt produziert so wie es ist den Error welcher auf dem von mir geposteten Screen zu sehen ist.
    Falls das nicht ausreicht hier noch die SFML 2.1 Binaries:
    http://en.sfml-dev.org/forums/index.php?topic=13010.0



  • Ah.
    In VS 2013 reicht es anscheinend nicht mehr wenn das Projekt bei "Project Dependencies..." angegeben ist.
    Er baut dann zwar in der richtigen Reihenfolge, aber er linkt das andere Projekt nicht dazu.

    Damit er das macht, musst du in den Projekteigenschaften unter Common Properties/References eine Project-Referenz setzen.
    So wie du das bei TacticsManager gemacht hast, aber eben nur bei TacticsManager.
    Klick dort die anderen Projekte auch noch dazu, dann sollte es sich ohne Fehler bauen lassen.



  • Jo, das war's. Funktioniert jetzt vielen Dank^^


Log in to reply