S
Hallo,
ich möchte eine kleine DLL schreiben (Visual Studio 2008 Pro) in der ich Fehler-Codes verwalte (so für Try and Catch, etc). Diese soll dann in verschiedene Klassen (in anderen DLLs) vererbt werden. Da ich meist mit wxWidgets arbeite habe ich zuerst mal wxWidgets als DLL erstellt. Das klappt auch und ich habe in meinem "lib\vc_dll"-Verzeichnis jede Menge *.lib und *.dll Dateien.
Wenn ich jetzt selbst ein DLL-Datei erzeugen möchte und dabei wxWidgets verwenden möchte, so habe ich folgendes aus dem schlauen Internet erarbeitet:
#ifdef _WINDLL // Wenn DLL-Exportiert wird
#include <wx/dlimpexp.h>
#define DLL_PRE WXEXPORT
#include "nmpWxDllLinker.h"
#else // _WINDLL
#include <wx/dlimpexp.h>
#define DLL_PRE WXIMPORT
#endif // _WINDLL
// Für Visual Studio folgende Libs einlinken
#if defined(__VISUALC__)
#ifdef _DEBUG
#pragma comment(lib, "wxbase28ud.lib")
#pragma comment(lib, "wxbase28ud_net.lib")
#pragma comment(lib, "wxbase28ud_xml.lib")
#pragma comment(lib, "wxexpatd.lib")
#pragma comment(lib, "wxjpegd.lib")
#pragma comment(lib, "wxmsw28ud_adv.lib")
#pragma comment(lib, "wxmsw28ud_aui.lib")
#pragma comment(lib, "wxmsw28ud_core.lib")
#pragma comment(lib, "wxmsw28ud_gl.lib")
#pragma comment(lib, "wxmsw28ud_html.lib")
#pragma comment(lib, "wxmsw28ud_media.lib")
#pragma comment(lib, "wxmsw28ud_qa.lib")
#pragma comment(lib, "wxmsw28ud_richtext.lib")
#pragma comment(lib, "wxmsw28ud_xrc.lib")
#pragma comment(lib, "wxpngd.lib")
#pragma comment(lib, "wxregexud.lib")
#pragma comment(lib, "wxtiffd.lib")
#pragma comment(lib, "wxzlibd.lib")
#else // _DEBUG
#pragma comment(lib, "wxbase28u.lib")
#pragma comment(lib, "wxbase28u_net.lib")
#pragma comment(lib, "wxbase28u_xml.lib")
#pragma comment(lib, "wxexpat.lib")
#pragma comment(lib, "wxjpeg.lib")
#pragma comment(lib, "wxmsw28u_adv.lib")
#pragma comment(lib, "wxmsw28u_aui.lib")
#pragma comment(lib, "wxmsw28u_core.lib")
#pragma comment(lib, "wxmsw28u_gl.lib")
#pragma comment(lib, "wxmsw28u_html.lib")
#pragma comment(lib, "wxmsw28u_media.lib")
#pragma comment(lib, "wxmsw28u_qa.lib")
#pragma comment(lib, "wxmsw28u_richtext.lib")
#pragma comment(lib, "wxmsw28u_xrc.lib")
#pragma comment(lib, "wxpng.lib")
#pragma comment(lib, "wxregexu.lib")
#pragma comment(lib, "wxtiff.lib")
#pragma comment(lib, "wxzlib.lib")
#endif //_DEBUG
#pragma comment(lib, "kernel32.lib")
#pragma comment(lib, "user32.lib")
#pragma comment(lib, "gdi32.lib")
#pragma comment(lib, "comdlg32.lib")
#pragma comment(lib, "winspool.lib")
#pragma comment(lib, "winmm.lib")
#pragma comment(lib, "shell32.lib")
#pragma comment(lib, "comctl32.lib")
#pragma comment(lib, "ole32.lib")
#pragma comment(lib, "oleaut32.lib")
#pragma comment(lib, "uuid.lib")
#pragma comment(lib, "rpcrt4.lib")
#pragma comment(lib, "advapi32.lib")
#pragma comment(lib, "wsock32.lib")
#pragma comment(lib, "wininet.lib")
#endif // defined(__VISUALC__)
Ich nutze dann noch
#pragma warning( disable : 4251 )
für das Unterdrücken der Warnung, dass die wxWidgets-DLL im Hauptprogramm geladen werden muss.
Soweit ich das sehe habe ich ALLE Lib-Dateien eingebunden. (Mehr hab ich nicht bekommen). Folglich dürften doch keine Linker-Fehler kommen. Aber leider schon.
class DLL_PRE myErrorMessage
{
private:
unsigned int ErrorNumber; // Speichern der internen Fehlernummer
wxString ErrorMessage; // Speichern des Fehlertextes
public:
/* c'tor */
// Fehlernummer und Nachricht setzten
myErrorMessage(const unsigned int& newErrorNumber, const wxString& newErrorMessage);
/* Abfragen */
// Abfragen der Nummer
unsigned int ErrorNumberGet() const;
// Abfragen der Nummer
wxString ErrorTextGet() const;
// Abfragen des Fehlertextes incl Nummer
wxString ErrorTextGetFull() const;
/* Ausgabe-Funktionen */
// Gibt die aktuelle Fehlermeldung im wxLogError aus
void wxLogErrorShow();
};
Ich erhalte im Debug folgendes:
2>Code wird generiert...
2>Verknüpfen...
2> Bibliothek "U:\xxx\dll\mySDK2_d.lib" und Objekt "U:\xxx\dll\mySDK2_d.exp" werden erstellt.
2>myErrorMessage.obj : error LNK2028: Nicht aufgelöstes Token (0A00152E) ""int g_isPainting" (?g_isPainting@@3HA)", auf das in Funktion ""public: virtual class wxEvent * __thiscall wxPaintEvent::Clone(void)const " (?Clone@wxPaintEvent@@$$FUBEPAVwxEvent@@XZ)" verwiesen wird.
2>myError.obj : error LNK2020: Nicht aufgelöstes Token (0A001535) "int g_isPainting" (?g_isPainting@@3HA).
2>myError.obj : error LNK2001: Nicht aufgelöstes externes Symbol ""int g_isPainting" (?g_isPainting@@3HA)".
2>myErrorMessage.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""int g_isPainting" (?g_isPainting@@3HA)" in Funktion ""public: virtual class wxEvent * __thiscall wxPaintEvent::Clone(void)const " (?Clone@wxPaintEvent@@$$FUBEPAVwxEvent@@XZ)".
2>U:\xxx\dll\mySDK2_d.dll : fatal error LNK1120: 3 nicht aufgelöste externe Verweise.
2>Das Buildprotokoll wurde unter "file://u:\xxx\Debug\BuildLog.htm" gespeichert.
2>mySDK2 - 5 Fehler, 0 Warnung(en)
Also irgendwo doch noch ne lib vergessen? Ich finde aber keine mehr. Ich hab versucht nach "g_isPainting" im Web zu suchen und zu schauen, wo das Ding definiert ist. Eigentlich in der "base" und die hab ich doch drinnen. Hilfe!
Wenn ich mit Release mache, dann erhalte ich folgende Fehlermeldung:
2>myError.obj : warning LNK4248: Nicht aufgelöstes Typeref-Token (0100001F) für "wxNativeFontInfo". Das Abbild kann möglicherweise nicht ausgeführt werden.
Auch hier nutze ich "nur" den wxString. Also was hat diese nich aufgelöste Vorwärtsdeklaration damit zu tun? Ich verstehe es nicht.
Irgendwie blick ich das mit den DLLs und wxWidgets nicht ganz. Wenn ich alle wxWidgets-Abhängigkeiten rausnehme und alle wxString zu int mache (zum Testen) dann klappt alles perfekto!
Bitte um Hilfe,
Stefan