[gelöst] Linker Problem beim Verwenden eigener Biblitohek
Verfasst: 29.05.2009, 12:29
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:
Die Implementierung im Quellcode sieht folgendermaßen aus:
Den Rückgabetyp habe ich wie folgt definiert
Ü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:
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:
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???
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;
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);
}
Code: Alles auswählen
typedef boost::shared_ptr<IRenderWindow> RenderWindowPtr;
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;
}
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
bzw. was ich falsch mache???