dllexport von Klasse mit statischem Attribut und vector schlägt fehl



  • Hi,

    Ich habe ein Projekt A und ein Projekt B. A ist eine EXE und B eine DLL-Anwendung. Ich möchte Header und Quellcode von B in A verwenden. Alles nicht weiter dramatisch:

    #ifndef VARIABLEMAPPER_
    #define VARIABLEMAPPER_
    
    #include <map>
    #include <string>
    
    using namespace std;
    
    namespace KRechner
    {
    	class __declspec(dllexport) VariableMapper
    	{
    	public:
    		static VariableMapper	instance_;
    
    		map<string, string> variableMap_;
    	};
    };
    
    #endif
    

    und die Quellcodedatei:

    #include "Test.hpp"
    
    namespace KRechner
    {
    	VariableMapper	VariableMapper::instance_;
    };
    

    Das liefert halt ein nicht aufgelöstes externes Symbol für instance_:

    Test.obj : error LNK2001: Nicht aufgelöstes externes Symbol ""public: static class KRechner::VariableMapper KRechner::VariableMapper::instance_" (?instance_@VariableMapper@KRechner@@2V12@A)".
    1>C:\Users\Mischa\Documents\Visual Studio 2008\Projects\SDL OGL\Debug\DLLTest.exe : fatal error LNK1120: 1 nicht aufgelöste externe Verweise.
    

    Der Clou ist: Wenn ich die Zeile map<string, string> variableMap_; aus dem Header entferne, funktioniert es. 😞

    Ideen?

    Viele Grüße



  • Eisflamme schrieb:

    Ich habe ein Projekt A und ein Projekt B. A ist eine EXE und B eine DLL-Anwendung. Ich möchte Header und Quellcode von B in A verwenden.

    Was erstens nichts mit ANSI C++ hat*, und zweitens mit den von dir verwendeten Elementen auch zwangsweise nicht nur abhängig vom Compiler sondern auch der Compilerversion ist (und vermutlich noch einigen Projekteinstellungen) - sofern überhaupt möglich.

    * Weder kennt C++ DLLs, noch ist der interne Aufbau von Klassen etc. standardisiert.

    Deine Frage sollte daher vermutlich im Zusammenhang mit einem speziellen Compiler (inkl. Nennung der Version) erfolgen, und gehört vermutlich auch in ein spezifischeres Unterforum (Ich würde auf "MFC (Visual C++)" tippen, da es auch Visual C++ spezifische Fragen abdeckt).



  • Ich war nicht sicher, ob ich vielleicht irgendwas standardmäßiges missverstanden haben könnte. Kann ja auch sein, dass ich nen Logikfehler o.ä. hab.

    Ich benutze Visual C++ 2008, also verschiebt mich gerne. Wobei das Forum MFC (Visual C++) eigentlich unter Frameworks steht und es darum ja nun gar nicht geht.



  • Dieser Thread wurde von Moderator/in pumuckl aus dem Forum C++ 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.



  • Eisflamme schrieb:

    Ich war nicht sicher, ob ich vielleicht irgendwas standardmäßiges missverstanden haben könnte.

    Nein, da vom Standard her dein Programm schon nicht abgedeckt wird (Wie gesagt: DLLs oder allgemein Bibliotheken (ob nun lib, dll, so...), werden vom Standard leider in keinster Weise unterstützt).



  • Okay, das Problem hat sich so weit gelöst...

    Aber ich kann Templates nicht in DLLs exportieren, das ist ja total blöd, oder?

    Hat jemand eine Idee, ob ich auf eine andere Art und Weise mehrere Projekte zusammen nehmen kann und dabei die Templates nicht verliere? Meinetwegen müssen die einzelnen Projekte ja auch nicht durch DLLs ausgelagert werden, kann ich die nicht durch irgendwelche Abhängigkeiten o.ä. verbinden?



  • Eisflamme schrieb:

    Aber ich kann Templates nicht in DLLs exportieren, das ist ja total blöd, oder?

    Ich halte dein Design ohnehin für nicht wirklich schön. Ich mag ohnehin keine öffentlichen Membervariablen (es sei den man hat es eher mit traditionellen Strukturen zu tun), und definiere an Schnittstellen eher Klassen mit rein virtuellen Methoden (Ala "virtual void SetValue(int value) = 0"; So das man auch nicht alle Projektteile neu linken muss, wenn man irgendwas internes anpasst, das die Schnittstelle nicht ändert).

    cu André



  • Natürlich sind öffentliche Membervariablen schlechter Stil. Das ist ja auch nur ein abgespecktes Beispiel, um den Fehler möglichst gut zu präsentieren. Und für möglichst schnellen Zugriff auf das Attribut, um den Fehler erzeugen zu können, habe ich es halt gerade public gemacht. 😉

    Die Frage stellt sich jetzt danach, ob ich mit VC++ 8.0 auch irgendwie mehrere Projekte zusammen verwenden kann, ohne über die DLL zu gehen und damit meine Template-Möglichkeiten zu verlieren.


Anmelden zum Antworten