VS: 2 Projekte in einer Solution laufen lassen, als .exe und .dll



  • Hallo zusammen,

    Ich versuch grad etwas, womit ich kaum Erfahrung habe da ich normalerweise auf meinem Linux-System programmiere, daher bin ich mit den Besonderheiten von Visual Studio nicht so vertraut.

    Also, ich will in einer Solution zwei Projekte parallel ausführen. Das eine hab ich als Startup-Prjekt angegeben und als .exe konfiguriert, das andere als .dll. Den Standort der dll hab ich auch als Additional Include in den Properties des Startup-Projekt eingefügt.

    Nun will ich auf die Strukturen des dll-Projekts zugreifen, ein Objekt erzeugen und Methoden damit ausführen, ungefähr so:

    int main(){    
    
       Object1_Of_Class_Project1 = new Class_Project1();
       Object1_Of_Class_Project1->Function1();
       Object1_Of_Class_Project1->Function2();
    
       Object1_Of_Class_Project2 = new Class_Project2();
       Object1_Of_Class_Project2->Function1_Project2(); // Reads file
       Object1_Of_Class_Project2->Function2_Project2(); // Puts file lines in LineList
    
       for (item in LineList){
          do anything with line;   
       }
    }
    

    Allerdings bekomme ich die Fehlermeldung zurück

    unresolved external symbol "public: __thiscall Project2::Project2(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,int)" (??0Project2@@QAE@V?basic_string@DU?basic\_string@DU?char_traits@D@std@@V?$allocator@D@2@@std@@H@Z) referenced in function _main

    Weiß jemand was ich falsch mache?



  • Du mußt nicht nur die "Includes", sondern auch die DLL (bzw. dessen .lib-Datei) selber (unter "Linker/Additional Libraries") hinzufügen.
    Bei einer statischen Library müßte es auch funktionieren, wenn du die ".lib"_Datei direkt dem Projekt hinzufügst.



  • Hallo 🙂

    Den Tipp hab ich schon früher bekommen - allerdings wird bei mir nur eine dll erzeugt, und keine lib dazu. Ich hab auch die Nachbar-Verzeichnisse durchsucht für den Fall dass die lib (warum auch immer) woanders erzeugt wird - wird sie aber gar nicht. Muss ich dafür noch irgendwas anderes machen? Was einstellen?

    Viele Grüße,
    C.



  • Schon in der Fragestellung geht einiges durcheinander. Du meinst mit Projekten sicher Anwendungen (Prozesse). Nur EXEs sind eigenständige Anwendungen, DLLs nicht. DLLs sind ausgelagerte Programmteile (Funktionen, ggfs. auch Daten), die in die EXEs eingebunden werden. Für die Einbindung gibt es verschiedene Methoden (statisch oder dynamisch). Ich verstehe deine Frage so: du hast nur eine Anwendung, die eine DLL einbinden soll. Dazu muss die DLL die Funktionen exportieren und die Anwendung diese importieren. Eine LIB der DLL kann man mit dem OS-Tool implib erstellen: implib mydll.lib mydll.dll

    Da die Compiler und deren IDEs unterschiedlich mit DLLs umgehen, teile mit, welchen Compiler du einsetzt und ob für Konsole oder Windows. Dann kann dir sicher schnell geholfen werden.



  • berniebutt, du kannst Gedanken lesen 😃 Und zwar viel klarer und eindeutiger als diese in meinem Kopf sind 😃

    Also genau, ich hab eine Anwendung (.exe), die eine .dll importieren soll. Ich bin so weit gekommen, dass ich nicht die .dll sondern deren .lib einbinden sollte. Es wird jedoch keine erzeugt, nur die .dll.

    Ich verwende Visual Studio 2008 - ich vermute dass es irgendwo eine Einstellung geben muss, ob eine .lib erzeugt wird oder nicht, ich finde sie nur nicht 😕



  • Danke für das Lob mit dem Gedankenlesen. Ich versuche aber stets nur zu verstehen, worum es bei einer Frage geht bevor ich antworte. Du hast die DLL (hoffentlich einschliesslich der Angaben export) korrekt erstellt und brauchst jetzt nur noch die Importbibliothek dazu? Dafür gibt es implib mydll.lib mydll.dll, wenn die Projekt-IDE das nicht macht. Dieses OS-Tool wird im Fenster 'Eingabeaufforderung' aufgerufen und kann dort als Batch-Datei mit den gewünschten Anforderungen abgelegt werden. Ich kenne mich mit VS nicht aus, ob man dort solche zusätzlichen Tools einbauen kann. Bei Borland geht das. Bedenke bitte, die Importbibliothek allein reicht möglicherweise noch nicht. Der Compiler braucht sicher auch die Prototypen der importierten Funktionen.

    Man muss das nur einmal gemacht haben und weiss dann wie es geht.



  • Hey 🙂

    Ich hab die implib-Stelle unter Linker/Advanced gefunden und den Namen der zu erzeugenden .lib eingetragen. Die .lib wird trotzdem nicht erstellt 😞

    Nur noch nervig, ich sitze jetzt seit 3 Tagen dran .. 🙄

    Jemand muss doch so was auch machen, oder .. Also wenn, bitte in den Einstellungen schauen und posten, bitte bitte bitte ..



  • Standardmässig wird das Erzeugen der Importlib beim Erstellen eines neuen Dll-Projektes mit eingeschaltet. Keine Ahnung, was bei Deinem Projekt schiefgelaufen ist.

    Wäre es vielleicht eine Option, in Deiner Solution eine neues Dll-Projekt zu erstellen und dorthin die vorhandenen Sourcen zu kopieren?

    Hth,
    Christof



  • Meine Borland-IDE kennt noch eine Pfadeinstellung, wo die Importbibliothek landen soll. Benutze einfach die Windows-Suchfunktion oder überprüfe noch einmal die Einstellungen in deiner VS-IDE. Wenn du damit nicht klarkommst, nehme einfach - wie vorher beschrienen - das OS-Tool implib. 3 Tage an so etwas sollte man sich nicht aufhalten. 🙂



  • Kann mir einer mal verraten, was das ganze mit C++ zu tun hat?



  • Nichts weshalb es eigentlich verschoben gehört.



  • Eine Importbiblitohek wird nur generiert, wenn Du mit __declspec(dllexport) Symbole exportierst.



  • ttttt schrieb:

    Eine Importbiblitohek wird nur generiert, wenn Du mit __declspec(dllexport) Symbole exportierst.

    Das wiederum hatte ich als selbstverständlich betrachtet, man kann von einer DLL nichts importieren was von dieser nicht exportiert worden ist.

    Also Cordula: zeig mal etwas mehr Code deiner DLL her! Wie sollen wir dir helfen, wenn du mit DLLs noch wenig Erfahrungen hast?



  • Dieser Thread wurde von Moderator/in pumuckl aus dem Forum C++ (auch C++0x) in das Forum Compiler- und IDE-Forum verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.


Anmelden zum Antworten