[gelöst] Linker Problem beim Verwenden eigener Biblitohek

Programmiersprachen, APIs, Bibliotheken, Open Source Engines, Debugging, Quellcode Fehler und alles was mit praktischer Programmierung zu tun hat.
Antworten
Tactive
Beiträge: 61
Registriert: 21.07.2004, 15:10
Kontaktdaten:

[gelöst] Linker Problem beim Verwenden eigener Biblitohek

Beitrag von Tactive »

Hallo,

an meinem Projekt habe ich eine Klasse welche ich per __declspec(dllexport) exportiere, damit ich diese außerhalb der Bibliothek verwenden kann.
In dieser Klasse habe ich folgende Methode deklariert:

Code: Alles auswählen

virtual RenderWindowPtr CreateRenderWindow(const String name,
        const WindowProperties* properties = NULL,
        const void* reserved = NULL,
        const void* hwnd = NULL) const;
Die Implementierung im Quellcode sieht folgendermaßen aus:

Code: Alles auswählen

RenderWindowPtr APOApplication::CreateRenderWindow(const String name,
												   const WindowProperties* properties,
												   const void* reserved,
												   const void* hwnd) const
{
        APO_GUARD_FAST(_T("APOApplication::CreateRenderWindow"));
								
        if (m_activeRenderEnv.get() == NULL)
              APO_EXCEPT(ExceptionType::IllegalState, _T("Graphics system has not been initialized"), _T("APOApplication::CreateRenderWindow"));

         return m_activeRenderEnv->CreateRenderWindow(name, properties, reserved, hwnd);
}
Den Rückgabetyp habe ich wie folgt definiert

Code: Alles auswählen

typedef boost::shared_ptr<IRenderWindow> RenderWindowPtr;
Über die Verwendung der Boost-Smartpointer verhält sich das Ding also fast genauso wie das IUnknown Inteface von MS, nur das man sich keine
Gedanken um Aufrufe wie AddRef und Release machen muss.

Die Bibliothek kompiliert auch ohne Fehlermeldung und weitere Beanstandungen. In einem kleinen Testprojekt habe ich jetzt die Methode folendermaßen
versucht aufzurufen:

Code: Alles auswählen

int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
{
        APOApplicationPtr app = APOApplication::CreateApplication();
        {
                if (!app->IsRenderTypeAvailable(RenderType::Direct3D10))		
	        {
                        MessageBox(NULL, _T("No DirectX 10 available!"), _T("- APO -"), MB_OK);
                        return 0;
                }

                app->InitGraphics(RenderType::Direct3D10);
                RenderWindowPtr window = app->CreateRenderWindow(_T("Test"));
                window->Create();
                app->Start();
        }
        return 0;
}
Beim kompilieren beschwer sich nun der Linker, das er die Methode nicht finden kann. Durch weiteres Testen habe rausgefunden
das es wohl mit dem String-Parameter zusammenhängt, da es problemlos klappt wenn ich den Parameter entferne??

Die Definition des String-Objektes ist abhängig davon, ob das Projekt unter Verwendung des Unicode oder Multibyte Zeichensatzes
kompiliert wird. Dies steht natürlich in einer Header-Datei:

Code: Alles auswählen

        //- Char and String	

        typedef std::string						StdString;
        typedef std::wstring					StdWideString;

#if APO_UNICODE > 0
        typedef StdWideString					String;
        typedef wchar_t							Char;
#else
        typedef StdString						String;
        typedef char							Char;
#endif
Der Zeichensatz ist in beiden Projekten auf UNICODE eingestellt, so das es daran nicht liegen dürfte. Kann mir vielleicht jemand erklären wo mein Denkfehler liegt
bzw. was ich falsch mache???
Zuletzt geändert von Tactive am 29.05.2009, 13:25, insgesamt 1-mal geändert.
Helmut
Establishment
Beiträge: 237
Registriert: 11.07.2002, 15:49
Wohnort: Bonn
Kontaktdaten:

Re: Linker Problem beim Verwenden eigener Biblitohek

Beitrag von Helmut »

Hi
Hier steht, wie du das Problem finden kannst. Vielleicht ist es sogar die gleiche Ursache wie im Link, wchar_t ist in einem Modul ein eigener Typ und im anderen ein short. Das glaube ich aber weniger. Eher, dass die zwei Runtimes string bei dir unterschiedlich implementieren. Lösen kannst du das, indem du jedweils die gleiche DLL Runtime benutzt oder den String per Referenz übergibst.

Ciao
Tactive
Beiträge: 61
Registriert: 21.07.2004, 15:10
Kontaktdaten:

Re: Linker Problem beim Verwenden eigener Biblitohek

Beitrag von Tactive »

Ja, denke das der Ansatz in die Richtung meines Problemes geht. Da ich die Klasse ja exportiere stellt das mit solchen Objekten generell eine Gefahr da, weil ja eigendlich alles nach C exportiert wird - also nur Basistypen zulässig sind. Ich habe das in meiner Schnittstelle jetzt auf const Char* umgeschrieben (was dann entweder char* oder wchat_t* ist) und nun klappts auch mit dem Linker.

Danke für Deine schnelle Antwort.
Antworten