Programm will MSVCR80.dll
-
Folgendes Szenario:
Programm wurde mit VS2005 erstellt. Es linkt weitere dlls nach. Im Release läuft alles, im Debug kommtDie Anwendung konnte nicht gestartet werden, weil MSVCR80.dll nicht gefunden wurde.Erste Vermutung: Manifestprobleme der mitgelinkten libs.
Im Dependency Walker dann die Überraschung: Es scheint dass das eigentliche Programm und keine unter lib die MSVCR80.dll haben will, aber keine bekommt. Wieso? Ich habe doch explizit debug kompiliert, sollte dann nicht auch die MSVCR80D.dll verlangt werden? Debug is doch Debug. Das weitere komische ist: Es verlangt auch die Debug Version.
Die MSVCR80D.dll wird aus dem winsxs vc80.debugcrt geladen und auch vom Programm selbst und nicht von den libs.
Was kann man da denn tun?Das Manifest der Exe sieht eigentlich so aus, und klar, die nicht debug dll wird verlangt, steht aber im manifest nicht drin... aber wieso?
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> <dependency> <dependentAssembly> <assemblyIdentity type="win32" name="Microsoft.VC80.DebugCRT" version="8.0.50727.762" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity> </dependentAssembly> </dependency> </assembly>
-
Seikilos schrieb:
Im Dependency Walker dann die Überraschung: Es scheint dass das eigentliche Programm und keine unter lib die MSVCR80.dll haben will,
Was soll denn eine "unter lib" sein?
Wenn Du eine LIB dazugelinkt hast, dann ist diese LIB in Deiner EXE drin... somit will dann Deine EXE die DLL!Seikilos schrieb:
aber keine bekommt. Wieso? Ich habe doch explizit debug kompiliert, sollte dann nicht auch die MSVCR80D.dll verlangt werden?
genau. Schalte mal in den Linker-Einstellungen "/Verbose" an... dann siehst Du, wer die Release-Version will..
-
Ich linke ja libs wie Qt usw, die sehe ich dann ja als externe DLL und deren Abhängigkeiten. Dort hab ich ja auch die import lib und die DLL. Wenn eine dieser DLLs die MSVCR80.dll haben wollte, würde ich dies ja sehen, weil die fehlende DLL in dem Baum von Qt drin wäre usw.
Verbose ist sehr verbose, alle Zeilen mit MSVCR
2>LINK : warning LNK4098: Standardbibliothek "MSVCRT" steht in Konflikt mit anderen Bibliotheken; /NODEFAULTLIB:Bibliothek verwenden. 4>/DEFAULTLIB:MSVCRTD wurde verarbeitet. 4> "MSVCRTD.lib(MSVCR80D.dll)" geladen 4> Durchsuchen von C:\Programme\Microsoft Visual Studio 8\VC\lib\MSVCRT.lib: 4> __imp___stricmp gefunden. 4> In "OLDNAMES.lib(stricmp.obi)" referenziert 4> "MSVCRT.lib(MSVCR80.dll)" geladen 4> __imp___strnicmp gefunden. 4> In "OLDNAMES.lib(strnicmp.obi)" referenziert 4> "MSVCRT.lib(MSVCR80.dll)" geladen 4> __IMPORT_DESCRIPTOR_MSVCR80 gefunden. 4> In "MSVCRT.lib(MSVCR80.dll)" referenziert 4> In "MSVCRT.lib(MSVCR80.dll)" referenziert 4> "MSVCRT.lib(MSVCR80.dll)" geladen 4> MSVCR80_NULL_THUNK_DATA gefunden. 4> In "MSVCRT.lib(MSVCR80.dll)" referenziert 4> "MSVCRT.lib(MSVCR80.dll)" geladen MSVCRTD.lib(MSVCR80D.dll) 4> OLDNAMES.lib(stricmp.obi) 4> OLDNAMES.lib(strnicmp.obi) 4> MSVCRT.lib(MSVCR80.dll) 4> MSVCRT.lib(MSVCR80.dll) 4> MSVCRT.lib(MSVCR80.dll) 4> MSVCRT.lib(MSVCR80.dll)Also warum OLDNAMES.LIB (ka woher die kommt) die nicht D DLL haben will verstehe ich nicht.
Edit: DevIL lib linkt gegen stricmp, welches in oldnames definiert ist.
hab gegen die Release version gelinkt wegen ein paar anderen Problemen.Tja, da kommt mir nun Cmake in die quere, weil es ja unter linux debug oder release baut und unter windows im VC beides drin ist und ich aber ungern immer sowohl debug als auch release angeben will
-
Seikilos schrieb:
Edit: DevIL lib linkt gegen stricmp, welches in oldnames definiert ist.
hab gegen die Release version gelinkt wegen ein paar anderen Problemen.Tja, da kommt mir nun Cmake in die quere, weil es ja unter linux debug oder release baut und unter windows im VC beides drin ist und ich aber ungern immer sowohl debug als auch release angeben will
Was willst Du uns damit sagen?
-
Also ich tippe mal darauf, dass Du eine Library einfügst, die nur die Release Version der CRT will.
Deshalb der Fehler "warning LNK4098: Standardbibliothek "MSVCRT"!
Das dürfte schon nicht sein. Alle Libs müssen die selbe CRT verwenden. In Deinem Fall also Debug!
-
Ja das war das Problem. Ich hätte nur erwartet dass der Dependency Walker das besser separiert.
@Jochen: Das mit Cmake ist ein anderes Problem, man wählt bei Devil ja nur eine Lib und das ist enweder Release oder Debug, man müsste aber eigentlich zwei wählen, weil man ja bei VS beide braucht
-
Dann benenne die Debug-Version nach *d.lib um...
-
Ich gebe doch nur eine Datei an, wie soll ich bei einer Eingabe gleichzeitig die Release als auch die Debug Version angeben?
-
Hast Du kein VS2005? Da gibt es für Debug und Release zwei Einstellungen...
Das mit CMake verstehe ich nicht, was Du mir damit sagen willst...
-
Kennst du dich mit CMake aus? Die Einstellungen der Pfade werden nicht mehr in VS gemacht, sondern nur noch in CMake
-
Die Frage ist was für Libs Du verwendest. Nicht wie Du den Build anschmeißt.
Einer der verwendeten LIBs ist eben ein Release Build.
Schmeiß den Linker mit der /verbose Option an und schau welches Modul welche Libs verlangt.
-
Das haben wir doch schon auf diese Art vor ein paar Stunden gelöst, da oben is sogar der Output und dass ich es auf DevIL eingrenzen konnte.