Was ist mit diesem "CRT nicht initialisiert werden" Fehler?
Erstellte ich ein leeres C++ - Projekt in Visual Studio 2012 Express (für Desktop natürlich), und Hinzugefügt einige zufällige basic-code:
#include <cstdio>
#include <cstdlib>
typedef struct examplestruct
{
unsigned char num1;
unsigned short num2;
unsigned long num3;
unsigned long long num4;
} EXAMPLESTRUCT;
void examplefunction(unsigned long *num, int num2)
{
*num += num2;
return;
}
int main(int nArgs, char **pszArgs)
{
EXAMPLESTRUCT ExStructInstance = {0xFF, 0xFFFF, 0xFFFFFFFF, 0xFFFFFFFFFFFFFFFF};
printf("%d, %d, %u, %ull\n", ExStructInstance.num1, ExStructInstance.num2, ExStructInstance.num3, ExStructInstance.num4);
unsigned long num5 = ExStructInstance.num1 + ExStructInstance.num2;
printf("%d\n", num5);
examplefunction(&num5, 10);
printf("%d\n", num5);
system("pause");
return 0;
}
(Wenn Sie sich Fragen, was die Hölle ist über, ich bin Demontage die erstellte executable-Datei zu beobachten, das Verhalten der optimierende compiler, und auch mehr darüber zu erfahren x86 assembly.)
Unter Linker in den Projekt-Einstellungen habe ich ausgewählt Multi-threaded (/MT)
für die runtime-Bibliothek, also wäre es statisch verlinken.
Ich kompiliert und gestartet Debuggen mit F5 und sofort bekam diese Fehlermeldung in einer message-box:
Runtime Error!
Programm: C:\Users\xxxxx\Documents\P...
R6030
- CRT nicht initialisiert
So, in diesem basic-Programm wird nicht ausgeführt werden, aufgrund von einigen problem mit der runtime library, die ich nicht herausfinden können!
Irgendwelche Ideen? Ich würde nur gerne wissen, was hier Los ist. Vielen Dank im Voraus!
EDIT: zur info, dies ist alles in den Release-Modus.
- Sie sagen, Sie kompiliert und gestartet Debuggen, aber Sie sagen auch, Sie arbeiten im release-Modus. Sind Sie sicher, dass diese zwei Punkte?
- Überprüfen Sie diese - blogs.technet.com/b/virtualworld/archive/2010/07/07/...
- ist es möglich, debug-builds, so lange wie die build-kompiliert mit debug-Informationen aktiviert, selbst wenn nicht könnte man immer noch einen debugger anfügen, in der Montage aber
- Ja, debug-Informationen ist, und ich nur tun, es als eine schnelle Möglichkeit, um das Programm auszuführen, sowieso.
- Das ist nicht wirklich relevant - es ist der Umgang mit der Verknüpfung von Fremdanbieter-DLLs, und wie Sie verwirrt mit statischer/dynamischer Verknüpfung der CRT, und ich bin nicht mit jeder Drittanbieter-DLLs.
- Können Sie debugger beenden, wenn die Meldung erscheint?
- Sie schreiben, "sofort bekam diese Fehlermeldung in einer message-box". Nicht sicher 100% mit 2012 studio, aber dachte, dass Sie versuchen, erstellen von Konsolenanwendung, aber linker denke, das ist die GUI.
- siehe meine eigene Antwort
- Sie kann und darf nicht "in der Nähe" eine Frage, die nur durch das hinzufügen GESCHLOSSEN, um den Titel, nur weil Sie herausgefunden die Antwort. Einfach posten Sie Ihre eigene Antwort, und markieren Sie diese dann als angenommen, wenn es besser ist als das bestehende.
- Ah, sorry.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Starten Sie ein neues Projekt mit "Empty project" - Vorlage hat ein Talent für ärger. Sie wahrscheinlich änderte sich ein weiteres Projekt-Einstellung, die bewirkt, dass sich Ihr Programm an den start main () - Methode anstelle der normalen Stelle, die CRT-Start-Funktion. Die Initialisierung der CRT, dann ruft main(). Schwer zu erraten, wie Sie es getan haben, vor allem, wenn Sie sprechen über die änderung der linker-Einstellung zu bekommen /MT. Das ist eine compiler-Einstellung.
Fallen in die Grube der Erfolg durch die mithilfe der Win32 - + Win2 Console Application Projekt Vorlage statt. Löschen Sie die pre-code generiert, abzüglich der
#include <stdafx.h> line
an der Spitze. Zumindest müssen Sie nun einen Ausgangspunkt, der uns helfen kann Ihnen helfen, Probleme zu lösen. Und nicht zu überspringen die "Hallo Welt" - Programm.Habe das problem behoben, und es ist ein Fehler meinerseits.
Hatte ich den Eintrag Punkt explizit zu
main
in den linker-Einstellungen, wenn es hätte sein sollen Standard.Ein Konsole-Programm mit dem CRT hat tatsächlich einen Einstiegspunkt namens
_mainCRTStartup
, die initialisiert den CRT vor dem Aufruf des Programmsmain
- Funktion, die fast eine "pseudo-entry-point".Setzen Sie den Eintrag zeigen sich in den linker-Einstellungen
_mainCRTStartup
niemals aufgerufen wird, so dass die CRT ist nie initialisiert; das Programm startet beimain
und kann nicht ausgeführt werden CRT-Funktionen.Habe ich einfach entfernt, die explizit definierten Einstiegspunkt, und alles funktionierte.
Du jeden Tag etwas neues lernen.