msvcp80d.dll nicht gefunden
-
Ich habe ein Projekt das erst im Debug Modus nur Unsinn produziert hat (cout ohne Ausgabe, Überladene Operatoren ohne korrekte Übergabewerte) im Releasemodus aber perfekt läuft und jetzt im Debug Modus den 'msvcp80d.dll nicht gefunden' Fehler liefert. Bisher konnte ich den immer wieder loswerden indem ich bin und build Verzeichnis gelöscht habe, jetzt hilft das nicht mehr.
Übrigens mit VS 2005 SP1.
Das ganze ist ein Matrix Demo Projekt mit blankem C++ (keine Microsoft Biliotheken). Auch schonmal hier gezeigt, da allerdings noch mit ein bischen Qt http://www.c-plusplus.net/forum/viewtopic-var-t-is-230960.html.
Jetzt eben als möglichst Plattform- und Toolkit-unabhängiges VS-Projekt.
Könnt ihr mir helfen es wieder zum Laufen zu bringen?
Hier das komplette Projekt:
http://www.matthiaspospiech.de/download/cpp/Matrix.zipHier die vcproj Datei:
<?xml version="1.0" encoding="Windows-1252"?> <VisualStudioProject ProjectType="Visual C++" Version="8,00" Name="Matrix2" ProjectGUID="{14F084C4-B9E8-4A33-92D5-0DED36A2D9D7}" RootNamespace="Matrix2" Keyword="Win32Proj" > <Platforms> <Platform Name="Win32" /> </Platforms> <ToolFiles> </ToolFiles> <Configurations> <Configuration Name="Debug|Win32" OutputDirectory="$(SolutionDir)Build\$(ProjectName)\$(ConfigurationName)" IntermediateDirectory="$(SolutionDir)Build\$(ProjectName)\$(ConfigurationName)" ConfigurationType="1" CharacterSet="1" > <Tool Name="VCPreBuildEventTool" /> <Tool Name="VCCustomBuildTool" /> <Tool Name="VCXMLDataGeneratorTool" /> <Tool Name="VCWebServiceProxyGeneratorTool" /> <Tool Name="VCMIDLTool" /> <Tool Name="VCCLCompilerTool" Optimization="2" InlineFunctionExpansion="2" FavorSizeOrSpeed="1" WholeProgramOptimization="false" AdditionalIncludeDirectories=""$(SolutionDir)\include";"$(SolutionDir)\src";include\eigen" PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE" MinimalRebuild="true" BasicRuntimeChecks="0" RuntimeLibrary="3" UsePrecompiledHeader="0" WarningLevel="3" Detect64BitPortabilityProblems="false" DebugInformationFormat="3" /> <Tool Name="VCManagedResourceCompilerTool" /> <Tool Name="VCResourceCompilerTool" /> <Tool Name="VCPreLinkEventTool" /> <Tool Name="VCLinkerTool" OutputFile="$(SolutionDir)/bin/debug/$(ProjectName)d.exe" LinkIncremental="2" GenerateDebugInformation="true" SubSystem="1" TargetMachine="1" /> <Tool Name="VCALinkTool" /> <Tool Name="VCManifestTool" /> <Tool Name="VCXDCMakeTool" /> <Tool Name="VCBscMakeTool" /> <Tool Name="VCFxCopTool" /> <Tool Name="VCAppVerifierTool" /> <Tool Name="VCWebDeploymentTool" /> <Tool Name="VCPostBuildEventTool" /> </Configuration> <Configuration Name="Release|Win32" OutputDirectory="$(SolutionDir)Build\$(ProjectName)\$(ConfigurationName)" IntermediateDirectory="$(SolutionDir)Build\$(ProjectName)\$(ConfigurationName)" ConfigurationType="1" CharacterSet="1" WholeProgramOptimization="1" > <Tool Name="VCPreBuildEventTool" /> <Tool Name="VCCustomBuildTool" /> <Tool Name="VCXMLDataGeneratorTool" /> <Tool Name="VCWebServiceProxyGeneratorTool" /> <Tool Name="VCMIDLTool" /> <Tool Name="VCCLCompilerTool" UseUnicodeResponseFiles="true" InlineFunctionExpansion="2" FavorSizeOrSpeed="1" AdditionalIncludeDirectories=""$(SolutionDir)\include";"$(SolutionDir)\src";include\eigen" PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE" RuntimeLibrary="2" UsePrecompiledHeader="0" WarningLevel="3" Detect64BitPortabilityProblems="false" DebugInformationFormat="3" /> <Tool Name="VCManagedResourceCompilerTool" /> <Tool Name="VCResourceCompilerTool" /> <Tool Name="VCPreLinkEventTool" /> <Tool Name="VCLinkerTool" OutputFile="$(SolutionDir)/bin/release/$(ProjectName).exe" LinkIncremental="1" GenerateDebugInformation="true" SubSystem="1" OptimizeReferences="2" EnableCOMDATFolding="2" TargetMachine="1" /> <Tool Name="VCALinkTool" /> <Tool Name="VCManifestTool" /> <Tool Name="VCXDCMakeTool" /> <Tool Name="VCBscMakeTool" /> <Tool Name="VCFxCopTool" /> <Tool Name="VCAppVerifierTool" /> <Tool Name="VCWebDeploymentTool" /> <Tool Name="VCPostBuildEventTool" /> </Configuration> </Configurations> <References> </References> <Files> <Filter Name="Quelldateien" Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx" UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}" > <File RelativePath=".\src\main.cpp" > </File> <File RelativePath=".\src\Matrix.cpp" > </File> <File RelativePath=".\src\MatrixTest.cpp" > </File> </Filter> <Filter Name="Headerdateien" Filter="h;hpp;hxx;hm;inl;inc;xsd" UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}" > <File RelativePath=".\src\Matrix.h" > </File> <File RelativePath=".\src\MatrixTest.h" > </File> <File RelativePath=".\src\TimeCounter.h" > </File> </Filter> <Filter Name="Ressourcendateien" Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav" UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}" > </Filter> </Files> <Globals> </Globals> </VisualStudioProject>
-
Weil du die C Runtime dynamisch linkst, bekommst du Überaschung
Abhängigkeit von der CRT-DLL. Also entweder auf statisches Linken umstellen oder die nötigen DLLs dazukopieren.
Aber eigentlich:
schmeiß doch einfach den unnötigen destructor und assignment operator sowie den fehlerhaften copy constructor 'raus, dann läuft's sowohl im Debug als auch im Release (bei mir schmierte dein Projekt im Release ab (VS2008 SP1)).
Und mache nicht dieses komische Zeugs mit den Compileroptimierungen, stelle sie im Release auf "full" und die einzelnen Optionen auf Defaultwerte (bringt ca 2x an Performance). Mit PGO war bei mir übrigens eine Performancesteigerung von ca. 12x drin. Und dann auf x64 gebaut macht noch ca. 1.3x. Insgesamt also von ca 3600ms auf 85ms 'runter, nur durch etwas Compilerquälen :).
-
Superlexx schrieb:
Weil du die C Runtime dynamisch linkst, bekommst du Überaschung
Abhängigkeit von der CRT-DLL. Also entweder auf statisches Linken umstellen oder die nötigen DLLs dazukopieren.
Das ist mir im Grund auch klar, aber erklärt nicht warum es im Release Modus immer und im Debug manchmal funktionerit - auch ohne Dlls.
Superlexx schrieb:
schmeiß doch einfach den unnötigen destructor und assignment operator sowie den fehlerhaften copy constructor 'raus, dann läuft's sowohl im Debug als auch im Release (bei mir schmierte dein Projekt im Release ab (VS2008 SP1)).
Hmm, bevor ich Dinge entferne wüsste ich gerne warum sie fehlerhaft sind - ich sehe es nämlich nicht.
Superlexx schrieb:
Und mache nicht dieses komische Zeugs mit den Compileroptimierungen, stelle sie im Release auf "full" und die einzelnen Optionen auf Defaultwerte (bringt ca 2x an Performance). Mit PGO war bei mir übrigens eine Performancesteigerung von ca. 12x drin. Und dann auf x64 gebaut macht noch ca. 1.3x. Insgesamt also von ca 3600ms auf 85ms 'runter, nur durch etwas Compilerquälen :).
Wäre Standard alle anderen auf "0" zu stellen? In VS kann ich ja nicht sehen was Standard ist.
-
Wenn ich die DLLs reinkopiere, dann schimpt VS dass ich die C Runtime Biliotheken ohne Manifest benutzen zu versuche und bricht ab.
Das bringt mich also 0 weiter. Wie bekomme ich also wieder ein korrektes Manifest?
Das Manifest im Build/debug Order (Matrix2d.exe.embed.manifest) sieht so aus<?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>
-
Wen es sich um Deinen Entwicklungsrechner handelt, dann ist vermutlich den WinSxS Verzeichnis zerstört.
Installiere Dein Studio nochmal.
Kontrolliere selbst das Verzeichnis
C:\WINDOWS\WinSxS\x86_Microsoft.VC80.DebugCRT_1fc8b3b9a1e18e3b_8.0.50727.762_x-ww_5490cd9fSchau in Dein Eventlog. Da steht mehr dazu.
-
Superlexx schrieb:
bei mir schmierte dein Projekt im Release ab (VS2008 SP1))
Auf der Arbeit funktioniert es bei mir Einwandfrei. Aber da es bei dir abstürzt, und ich es gerne als Demo weitergeben möchte bin ich sehr daran interessiert das der Code auch überall funktioniert. Kannst du weitere Informationen liefern?
-
ich bin gerade nicht am Rechner, an dem ich dein Program getestet habe, aber ich kann dir sagen, dass der Fehler im copy constructor darin besteht, dass 'm' nicht korrekt initialisiert wird. Der Aufruf "matrix(.., ..)" erstellt ein temporäres objekt (das gleich darauf gelöscht wird, sieht man schön im Disassembly) und tut nicht das, was der Kommentar drüber sagt (btw. sind Kommentare dazu da, auszusagen, warum etwas und nicht was gemacht wird (bis auf wenige Ausnahmen)).
-
Superlexx schrieb:
ich bin gerade nicht am Rechner, an dem ich dein Program getestet habe, aber ich kann dir sagen, dass der Fehler im copy constructor darin besteht, dass 'm' nicht korrekt initialisiert wird. Der Aufruf "matrix(.., ..)" erstellt ein temporäres objekt (das gleich darauf gelöscht wird, sieht man schön im Disassembly) und tut nicht das, was der Kommentar drüber sagt (btw. sind Kommentare dazu da, auszusagen, warum etwas und nicht was gemacht wird (bis auf wenige Ausnahmen)).
Zu den Kommentare: Ich habe vor allem für sehr unerfahrenen C++ Programmieren (die das lesen werden) kommentiert. Ansonsten würde ich viele Kommentare weglassen.
Zum Code, das hier sollte jetzt aber funktionieren:
void matrix::createMatrix(int row_count, int col_count) { rows = row_count; cols = col_count; if (elements() <= 0) throw "Matrix element count invalid"; m = make2DimVector(rows, cols); } /*! Copy - Constructor */ matrix::matrix(const matrix &s) { // create matrix of new sizes createMatrix(s.rows, s.cols); // copy data for(int i=0; i< rows; ++i) { for(int j=0; j< cols; ++j) { m[i][j] = s.m[i][j]; } } }
Matthias
-
pospiech schrieb:
Zum Code, das hier sollte jetzt aber funktionieren:
Warum nicht einfach m = s.m ?
Warum überhaupt ein Copy-Konstruktor für eine Klasse, die keinen braucht?
Sollen die "sehr unerfahrenen C++ Programmierer" lernen, wie man durch unnötigen Code mehr Gelegenheit zum Fehlermachen hat?
-
MFK schrieb:
pospiech schrieb:
Zum Code, das hier sollte jetzt aber funktionieren:
Warum nicht einfach m = s.m ?
Ich wollte eigentlich als nächsten von vector Arrays zu einem C-Array zurückbasteln. Da kann ich diese Zuweisung spätestens nicht mehr machen.
MFK schrieb:
Warum überhaupt ein Copy-Konstruktor für eine Klasse, die keinen braucht?
Warum braucht die Klassen keinen?
MFK schrieb:
Sollen die "sehr unerfahrenen C++ Programmierer" lernen, wie man durch unnötigen Code mehr Gelegenheit zum Fehlermachen hat?
Natürlich nicht. Aber mir ist noch nicht klar, warum genau ich es nicht brauche.
-
pospiech schrieb:
MFK schrieb:
Warum überhaupt ein Copy-Konstruktor für eine Klasse, die keinen braucht?
Warum braucht die Klassen keinen?
Weil deine Klasse keinen dynamischen Speicher verwaltet, und auch sonst nichts tut, das so etwas erfordern würde. Der vector kümmert sich selbst um seinen Speicher.
Deine Klasse braucht weder Zuweisungsoperator noch Copykonstruktor oder Destruktor. Die vom Compiler automatisch generierten Methoden machen bereits genau das Richtige.
-
Martin Richter schrieb:
Wen es sich um Deinen Entwicklungsrechner handelt, dann ist vermutlich den WinSxS Verzeichnis zerstört.
Installiere Dein Studio nochmal.
Kontrolliere selbst das Verzeichnis
C:\WINDOWS\WinSxS\x86_Microsoft.VC80.DebugCRT_1fc8b3b9a1e18e3b_8.0.50727.762_x-ww_5490cd9falso, das Verzeichnis existiert und enthält die folgenden Dateien
msvcm80d.dll
msvcp80d.dll
msvcr80d.dllMartin Richter schrieb:
Schau in Dein Eventlog. Da steht mehr dazu.
Inwiefern? Ich sehe nur exakt die Dialogfehlermeldung als Event.
Das Manifest in der EXE ist auch total falsch:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?><assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1"></assembly>
kann also nicht funktionieren. Offensichtlich macht also VS 2005 etwa falsch.
EDIT:
das hier hat mich auf die Lösung gebracht:
http://social.msdn.microsoft.com/Forums/en-US/vcgeneral/thread/6d16ecce-f92b-4c53-a45b-40119c4566a6/#page:1ich musste den FAT32 schalter umlegen, auch wenn die Partition ext3 ist...
Matthias