linker fehler bei verwendung von dll



  • dinge, die bisher keinen erfolg hatten:
    - wxPack in der aktuellen version 2.8.11 neu installieren
    - einstellungen von http://wiki.wxwidgets.org/Microsoft_Visual_C%2B%2B_Guide#Creating_a_New_Project_by_Hand übernehmen
    - konfiguration -> c++ -> sprache -> WChar_t als integrierten Typ behandeln auf Nein stellen (erste fehlermeldung enthaält etwas von wchar_t)
    - config einstellungen mit einer anderen, problemlosen dll abgleichen. die fehlerhafte dll ist allerdings die einzige, die klassen von wxWidgets komponenten ableitet.

    muss man vielleicht grundsätzlich besondere dinge beachten, wenn man z.b. dialogelemente in dlls auslagert?

    verdammte hacke, ich stecke völlig fest. 😕

    ps: falls es wichtig sein sollte, ich arbeite mit visual studio 2010 pro.



  • Hmm, also ich arbyte mit wxWidgets 2.9 und da hatte ich das Problem bisher nie. Bin auch etwas ratlos tbh.
    Problem ist halt, dass er Symbole für wxString auch in der DLL findet. Bist Du sicher dass Du in der DLL nicht gegen die statische Version linkst vllt?
    Bei Deinen Optionen sind leider die Libraries nicht dabei gegen die Du linkst.
    rya.



  • laufzeitbibliothek ist bei dll und app /MDd, falls du das meinst?
    oder kann ich sonst noch andere infos posten?



  • du meinst bestimmt das hier, oder?
    http://www.wxwidgets.org/docs/faqmsw.htm#crtmismatch



  • Nein, ich meinte ob Du in deiner DLL vielleicht gegen eine statische Library von wxWidgets linkst aus Versehen.. kopier mal alle Libraries gegen Du in der DLL bzw App linkst hier rein in Quotes.
    rya.



  • dll

    zusätzlich:

    comctl32.lib
    rpcrt4.lib
    ecwdaWin.lib
    libxml2.lib
    wxmsw28ud_core.lib
    wxbase28ud.lib

    vererbt:

    kernel32.lib
    user32.lib
    gdi32.lib
    winspool.lib
    comdlg32.lib
    advapi32.lib
    shell32.lib
    ole32.lib
    oleaut32.lib
    uuid.lib
    odbc32.lib
    odbccp32.lib

    app
    zusätzlich:

    libConfig.lib
    ecwdaWin.lib
    libsfWin.lib
    libdfWin.lib
    passEnc.lib
    comctl32.lib
    rpcrt4.lib
    winmm.lib
    wsock32.lib
    version.lib
    libxml2.lib
    wxmsw28ud_core.lib
    wxbase28ud.lib

    vererbt:

    kernel32.lib
    user32.lib
    gdi32.lib
    winspool.lib
    comdlg32.lib
    advapi32.lib
    shell32.lib
    ole32.lib
    oleaut32.lib
    uuid.lib
    odbc32.lib
    odbccp32.lib

    ich hatte auch schonmal

    wxmsw28ud_core.lib
    wxbase28ud.lib

    gar nicht drin, hat auch nix geändert.

    danke für deine mühe. 👍



  • Hmm, also eigentlich sollte das gehen. Tut mir leid, das is alles so eigentlich in Ordnung.... ist wxPack auch mit dem MSVC2010 kompiliert?
    Ich schätze mal es bleibt Dir nix anderes übrig als die Library mal selber mit dem VC2010 zu kompilieren und es dann nochmal zu versuchen.Ich verwende leider nur VC2008, kann Dir daher von vornherein keine Tipps geben.

    gar nicht drin, hat auch nix geändert

    Hast Du auch alles nochmal kompiliert? Also komplett neu und vorher nen "Clean" durchgeführt?
    rya.



  • ich hab die projektmappe bereinigt und alles neu kompiliert, ändert sich nix.

    dann mach ich mich mal morgen dran, 2.9.1 mit meinem vs2010 neu zu kompilieren und melden mich dann.
    danke!



  • ok, ich bin jetzt auf 2.9.1 selber kompiliert mit vs2010 und der fehler existiert leider immernoch:

    1>wxbase29ud.lib(object.obj) : error LNK2005: "public: __thiscall wxFormatString::wxFormatString(wchar_t const *)" (??0wxFormatString@@QAE@PB_W@Z) ist bereits in libConfig.lib(libConfig.dll) definiert.
    1>wxbase29ud.lib(object.obj) : error LNK2005: "public: __thiscall wxFormatString::operator wchar_t const *(void)const " (??BwxFormatString@@QBEPB_WXZ) ist bereits in libConfig.lib(libConfig.dll) definiert.
    1>wxbase29ud.lib(object.obj) : error LNK2005: "public: __thiscall wxString::wxString(wchar_t const *)" (??0wxString@@QAE@PB_W@Z) ist bereits in libConfig.lib(libConfig.dll) definiert.
    1>wxbase29ud.lib(object.obj) : error LNK2005: "public: __thiscall wxString::~wxString(void)" (??1wxString@@QAE@XZ) ist bereits in libConfig.lib(libConfig.dll) definiert.
    1>wxbase29ud.lib(object.obj) : error LNK2005: "public: __thiscall wxFormatString::~wxFormatString(void)" (??1wxFormatString@@QAE@XZ) ist bereits in libConfig.lib(libConfig.dll) definiert.

    das sind wieder nur die ersten fünf meldungen, die liste ist sehr lang.

    noch eine idee vielleicht, jemand?!
    auf welchem weg kann denn wxString schon in libConfig.dll definiert sein?



  • hallo zusammen,

    ich bin mir mittlerweile recht sicher, dass das problem wie von Scorcher24 schon gesagt das statische linken der wx libs ist. das problem ist nun, dass ich das dynamische linken nicht hinbekomme.
    folgendes habe ich gemacht, fehlt da vielleicht noch etwas?

    a) wx nach folgender anleitung mit profil DLL debug builden: http://wiki.wxwidgets.org/Microsoft_Visual_C%2B%2B_Guide#Visual_Studio_C.2B.2B_2010
    b) präprozessor symbole vom wx build in meine dll, die neben der app auch wxwidgets benutzt, übernehmen
    c) in visual studio unter linker -> zusätzliche bibliotheksverzeichnisse den eintrag "(WXWIN)\\lib\\vc\_lib" in "(WXWIN)\lib\vc_dll" ändern

    ich bekomme dann eine lange liste von fehlern, die mit vielen einträgen der art

    error LNK2001: Nicht aufgelöstes externes Symbol ""bool const wxFalse" (?wxFalse@@3_NB)".

    meine einstellungen sind:
    compiler:

    /I"E:\_WINOHNEDLL\src" /I"F:\wxWidgets_2_9\include" /I"F:\wxWidgets_2_9\include\msvc" /I"F:\Programme\National Instruments\NI-DAQ\DAQmx ANSI C Dev\include" /ZI /nologo /W3 /WX- /Od /Oy- /D "_WINDLL" /D "WXMAKINGDLL" /D "_UNICODE" /D "UNICODE" /Gm /EHsc /RTC1 /MDd /GS /fp:precise /Zc:wchar_t /Zc:forScope /GR /Fp"Debug\ecwdaWin.pch" /Fa"Debug\" /Fo"Debug\" /Fd"Debug\vc100.pdb" /Gd /FI"F:\wxWidgets_2_9/include/wx/wxprec.h" /FI"F:\wxWidgets_2_9/include/msvc/wx/setup.h" /analyze- /errorReport:queue

    linker:

    /OUT:"E:\libecwda\lib\ecwdaWin.dll" /INCREMENTAL /NOLOGO /LIBPATH:"F:\Programme\National Instruments\NI-DAQ\DAQmx ANSI C Dev\lib\msvc" /LIBPATH:"F:\wxWidgets_2_9/lib/vc_dll" /DLL "NIDAQmx.lib" "comctl32.lib" "rpcrt4.lib" "kernel32.lib" "user32.lib" "gdi32.lib" "winspool.lib" "comdlg32.lib" "advapi32.lib" "shell32.lib" "ole32.lib" "oleaut32.lib" "uuid.lib" "odbc32.lib" "odbccp32.lib" /NODEFAULTLIB:"LIBCMTD" /MANIFEST /ManifestFile:"Debug\ecwdaWin.dll.intermediate.manifest" /ALLOWISOLATION /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /DEBUG /PDB:"E:\libecwda\lib\ecwdaWin.pdb" /SUBSYSTEM:WINDOWS /PGD:"E:\libecwda\lib\ecwdaWin.pgd" /TLBID:1 /DYNAMICBASE /NXCOMPAT /MACHINE:X86 /ERRORREPORT:QUEUE

    hat jemand eine idee?



  • Welche Library hast Du denn gebaut von wx?
    Die .dll Version oder die statische?
    rya.



  • ich dachte, man baut mit dem "DLL Debug" profil die eben die dll version, oder? hab bisher auch kein anderes profil kompiliert, damit es nichtsd zum verwecheln gibt.



  • Nach einer Tasse Kaffee sticht mir das hier ins Auge:

    c) in visual studio unter linker -> zusätzliche bibliotheksverzeichnisse den eintrag "(WXWIN)\\lib\\vc\_lib" in "(WXWIN)\lib\vc_dll" ändern

    Wenn Du wx 2.9.1 hast, dann hast braucht die WXWIN Variable nicht, die Du ja bestimmt auch gar nicht gesetzt hast, oder doch? Weil das würde das ganze erklären. Gib als Pfad in den Linkereinstellungen von Visual Studio einfach den ganzen Pfad an, in dem sich dein wxWidgets befindet.
    Du machst Dir das glaube ich unnötig kompliziert.
    So schaut das bei mir aus:
    http://img30.imageshack.us/img30/7056/vc1l.jpg
    http://img183.imageshack.us/img183/9113/vc2h.jpg

    ich dachte, man baut mit dem "DLL Debug" profil die eben die dll version, oder? hab bisher auch kein anderes profil kompiliert, damit es nichtsd zum verwecheln gibt.

    Das ist richtig.



  • moin,

    schönes ding mit den verzeichnissen, macht es ein wenig übersichtlicher. ich hatte vorher WXWIN als umgebungsvariable gesetzt.

    jetzt sieht es bei mir so aus:
    http://img835.imageshack.us/img835/5417/includelib1.gif

    der fehler ist aber noch derselbe.



  • ich habe bei deinen einstellungen gesehen, dass du garnicht "[...]\wxWidgets_2_9\include\msvc" includen musst. kann das bei mir ein problem sein?

    wenn ich das raus nehme, kommen lauter solche fehler:

    fatal error C1083: Datei (Include) kann nicht geöffnet werden: "wx/setup.h": No such file or directory

    hmmm....

    ich habe jetzt auch mal testweise wx ohne die speziellen dateien für vs2010 gebuilded, die man unter http://forums.wxwidgets.org/viewtopic.php?t=27630 laut der vorher erwähnten anleitung runterladen kann. das ergebnis ist immernoch dasselbe.



  • Kompilier mal ein Sample ob das geht ausm Sample-Ordner.. wenn das auch nicht geht stimmt iwas bei Dir nicht :p.
    rya.



  • das sample project calendar kann ich kompilieren, ist aber auch statisch gelink, genauso wie alle anderen sample projekte. kann ich das vielleicht irgendwie auf statisches linken umstellen?



  • und ich kann die dll problemlos kompilieren, wenn ich das das bibliotheksverzeichnis von vc_dll auf vc_lib stelle... 😕
    das bringt mir aber nix, wiel ich dynamisch linken MUSS, sonst bekomme ich logischerweise "symbol xyz ist bereits in dll definiert" fehler bei wx komponenten wenn ich meine app kompiliere.



  • das problem ist gelöst, ich hatte falsche präprozessor symbole. bei verwendung von nur _DEBUG und WXUSINGDLL ging dann alles.
    vielen dank für eure mühe!!!


Anmelden zum Antworten