LNK2019 Problem bei 2 Enums



  • Hallo zusammen,

    ich habe eine Klasse "App" in einer DLL die (als Beispiel hier natürlich auf das wesentliche Problem vereinfacht) im Header wie folgt ausschaut:

    #pragma once
    
    #ifndef WIN32_LEAN_AND_MEAN
    #define WIN32_LEAN_AND_MEAN
    #endif
    
    #include <Windows.h>
    
    namespace ccore
    {
    
    	enum UI_RENDER_TYPE
    	{
    		UI_RENDER_TYPE_NONE,
    		UI_RENDER_TYPE_D2D1,
    		UI_RENDER_TYPE_D2D1_1,
    		UI_RENDER_TYPE_OPENGL
    	};
    
    	enum AUDIO_RENDER_TYPE
    	{
    		AUDIO_RENDER_TYPE_NONE,
    		AUDIO_RENDER_TYPE_WASAPI,
    		AUDIO_RENDER_TYPE_ASIO2,
    		AUDIO_RENDER_TYPE_KERNEL,
    		AUDIO_RENDER_TYPE_DIRECTSOUND,
    		AUDIO_RENDER_TYPE_MME
    	};
    
    	class __declspec(dllexport) App
    	{
    	public:
    		App();
    		~App();
    		HRESULT Initialize(UI_RENDER_TYPE uiRenderType, AUDIO_RENDER_TYPE audioRenderType);
    		void Run();
    	};
    
    }
    

    Und einen Konsumenten, der (natürlich ebenso vereinfacht) wie folgt ausschaut:

    #include "Foo\App.h"
    
    void Bar()
    {
    		std::unique_ptr<ccore::App> upApp(new ccore::App());
    		if (SUCCEEDED(upApp->Initialize(ccore::UI_RENDER_TYPE_D2D1, ccore::AUDIO_RENDER_TYPE_WASAPI)))
    		{
    			upApp->Run();
    		}
    }
    

    Allerdings erhalte ich nun bei upApp->Initialize 2 Linker-Fehler vom Typ 2019, dass die Verweise auf die beiden Enums UI_RENDER_TYPE und AUDIO_RENDER_TYPE nicht aufgelöst werden können.

    Aber die ich habe den Header korrekt eingebunden und auch den Verzeichnispfad korrekt gesetzt und gegen die LIB gelinkt (die auch wirklich existiert).

    Wo ist hier mein Denkfehler? Warum kann ich diese beiden Enums im Namespace ccore nicht nach extern öffentlich machen? Oder liegt hier ein anderes Problem vor?

    Vielen herzlichen Dank für alle Antworten und Tipps im voraus!



  • Habt Ihr da echt keine Idee?

    Mache ich denn hier irgendwas grundsätzliches falsch?



  • static electricity schrieb:

    Habt Ihr da echt keine Idee?

    Hast du den Eindruck, dass hier alle bereit stehen müssen, um deine Fragen zu beantworten?

    static electricity schrieb:

    Allerdings erhalte ich nun bei upApp->Initialize 2 Linker-Fehler vom Typ 2019, dass die Verweise auf die beiden Enums UI_RENDER_TYPE und AUDIO_RENDER_TYPE nicht aufgelöst werden können.

    Hier will keiner wissen, ob du die indirekte Rede beherrschst. Kopiere die Fehlermeldungen hier rein. Alle!

    Der Linker hat mit den Enums nichts zu tun, es muss auch kein Verweis darauf aufgelöst werden. Nimm dein vereinfachtes Beispiel und mach es übersetzbar. Wenn der Fehler dann immer noch auftritt, poste den Code hier.



  • manni66 schrieb:

    Hast du den Eindruck, dass hier alle bereit stehen müssen, um deine Fragen zu beantworten?

    Nein, natürlich nicht. Entschuldigung falls das so rüber kam.

    manni66 schrieb:

    Hier will keiner wissen, ob du die indirekte Rede beherrschst.

    Bitte, was?


  • Mod

    static electricity schrieb:

    Bitte, was?

    Du sollst nicht deine eigene prosaische Interpretation der Fehlermeldungen angeben, sondern die Fehlermeldungen wortwörtlich!



  • Danke!

    Hier die Meldung:

    error LNK2019: Verweis auf nicht aufgelöstes externes Symbol: ""public:long__thiscall ccore::App::Initialze(enum ccore::UI_RENDER_TYPE, enum ccore::AUDIO_RENDER_TYPE)" (? Initialize@App@ccore@@QAEJW4UI_RENDER_TYPE@2@W4AUDIO_RENDER_TYPE@2@@Z)" in Funktion "_WinMain@16".

    error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""public: void _thiscall ccore::App::Run(void)" (?Run@App@ccore@@QAEXXZ)" in Funktion "_WinMain@16".



  • Du hast offenbar ccore::App::Initialze() (<- Typo?) und ccore::App::Run() nirgendwo definiert...


  • Mod

    Um das jetzt mal direkt zu sagen: Du hast die Fehlermeldung total missverstanden. Hättest du sie gleich gepostet, hätte man dir sofort helfen können.

    Du benutzt die im Header deklarierten Funktionen App::Initialize und App::Run. Aber diese beiden Memberfunktionen werden nirgendwo definiert.

    P.S.: Erklärung der Fehlermeldung:
    Da steht:

    error <Fehlernummer> : Verweis auf nicht aufgelöstes externes Symbol: "" <Signatur aus deinem Programm> " ( <Bezeichner, den der Compiler daraus gemacht hat> " in Funktion " <Stelle in deinem Programm> ".

    Das heißt, die ganzen enums tauchen dort auf, weil sie Teil der Signatur der Funktion Initialize sind, da die Funktionsparameter vom enumtyp sind. Bei der ersten Meldung ist die Signatur der Funktion: public:long__thiscall ccore::App::Initialze(enum ccore::UI_RENDER_TYPE, enum ccore::AUDIO_RENDER_TYPE)
    Vergleiche mit deinem Programm:

    Initialize(UI_RENDER_TYPE uiRenderType, AUDIO_RENDER_TYPE audioRenderType);
    

    Du siehst, sie sind identisch, wenn du die ganzen umgebenden Namespaces und Klassen beachtest.

    Du siehst auch, dass bei der zweiten Fehlermeldung die enums gar nicht auftauchen, weil Run() gar keine Parameter hat.


Anmelden zum Antworten