2008-08-03 22 views
17

Eine MFC-Anwendung, die ich zu migrieren bin versucht, verwendet afxext.h, die _AFXDLL verursacht gesetzt werden, die diesen Fehler verursacht, wenn ich /MT gesetzt:Erstellen für Windows NT 4.0 mit Visual Studio 2005?

Bitte verwenden Sie die/MD-Schalter für _AFXDLL baut

Meine Forschung bisher gibt an, dass es für eine Anwendung erstellen Ausführung unter Windows NT 4.0 mit Visual Studio (C++, in diesem Fall) 2005

ist das wirklich wahr ist unmöglich? Gibt es eine Problemumgehung?

+1

Jemand bitte pro tect dies. –

Antwort

8

Nein, es gibt viele Anwendungen mit VS2005 gebaut, die Windows XP, 2000, NT, den gesamten Stapel unterstützen müssen. Das Problem besteht darin, dass VS2005 (standardmäßig) Bibliotheken/Exporte verwenden möchte, die nicht auf NT vorhanden sind.

Für einen Hintergrund siehe this thread.

Beginnen Sie dann, Ihre Abhängigkeiten über Präprozessor-Makros zu begrenzen und vermeiden Sie APIs, die auf NT nicht unterstützt werden.

+0

Das verwirrende Problem besteht darin, dass bei einer statischen Verknüpfung tatsächlich nur die Objektdateien abgerufen werden, die für die von Ihnen verwendeten Symbole benötigt werden. Aus diesem Grund scheint es die meiste Zeit unter NT4 zu funktionieren. –

4

Um den _AFXDLL-Fehler loszuwerden, haben Sie versucht, zu den Einstellungen zu ändern, um MFC als statische lib anstelle von DLL zu verwenden? Dies ist ähnlich dem, was Sie bereits tun, wenn Sie die Laufzeitbibliotheken statt in DLL in statisch ändern.

1

Obwohl ich mit afxext.h nicht vertraut bin, ich frage mich, was es es nicht kompatibel mit Windows NT4 ....

Allerdings macht die ursprüngliche Frage zu beantworten: „to date Meine Forschung zeigt, dass es unmöglich ist, eine Anwendung für die Ausführung unter Windows NT 4.0 mit Visual Studio (in diesem Fall C++ 2005) zu erstellen. "

Die Antwort sollte ja sein, besonders wenn die Anwendung ursprünglich geschrieben wurde oder auf NT4 läuft! Mit dem afxext.h Ding beiseite sollte dies ein einfaches JA sein.

Die andere Sache, mit der ich Probleme habe, ist die lockere Natur, in der Leute den NT Ausdruck hinauswerfen. Zugegeben, die meisten Leute denken an "NT" als Windows NT4, aber es ist immer noch mehrdeutig, weil "die meisten Menschen" nicht gleich "alle Menschen" sind.

In Wirklichkeit entspricht der Begriff "NT" der NT-Serie. Die NT-Serie ist NT3, NT4, NT5 (2000, XP, 2003) und NT6 (Vista).

Win32 ist ein Subsystem, das Sie auch auf Ihren C/C++ - Code anwenden. So sehe ich keinen Grund, warum man nicht in der Lage sein sollte, diese NT4-Plattform & Subsystem oder, wenn dies eine Plattform Portierung Übung ist, entfernen Sie die MFC-Abhängigkeiten, die VC möglicherweise auferlegt.

Hinzufügen der afxext.h zum Mix, es klingt für mich wie ein Subsystem Kompatibilitätsproblem. Es ist Teil von MFC aus meiner Google-Recherche. Die afxext.h scheint die MFC-Erweiterungen (Microsoft Foundation Class) zu sein.

Können Sie Ihre Abhängigkeit von MFC entfernen? Welche Art von Anwendung ist das? (CLR, Service, GUI-Schnittstelle?) Können Sie in VC 8.0 ein Projekt in ein nicht verwaltetes C++ - Projekt konvertieren?

Hoffentlich werden Ihnen einige davon helfen.

3

Die Problemumgehung besteht darin, die Multithread-DLL zu beheben. Simple instructions.Kurze Zusammenfassung:

Der Versand 8.0 C-Laufzeitbibliothek DLL (MSVCR80.dll) nicht unterstützt NT 4.0 SP6 aus einem Grund und nur aus einem Grund: jemand bei Microsoft einen Funktionsaufruf zu GetLongPathNameW, die hinzugefügt existiert nicht in kernel32.dll auf NT 4.0.

CRTLIB.C In Zeile 577 wird ein Anruf an GetLongPathNameW gesendet. Ersetzen Sie es einfach mit: ret = 0; Verwenden Sie diesen Build von MSVCR80.DLL nur unter NT 4.0.

Sobald Sie diese arbeiten, sollte eine allgemeinere Lösung trivial sein.

-1

Die Idee ist, dass die Exe benötigt wird, um mit der statischen Bibliothek zu verknüpfen.

Bitte versuchen Sie diesen „Konfigurationseigenschaften“, „Allgemein“, „Die Verwendung von MFC“ auf „Verwenden MFC in einer statischen Bibliothek“ „Konfigurationseigenschaften“, „Allgemein“, „Die Verwendung von ATL“ auf „statischen Link ATL“

"Konfigurationseigenschaften", "C \ C++", "Code Generation", "Laufzeitbibliothek" auf "Multi-Threaded (\ MT)"

Testplattform Build-Maschine: Visual Studio 2005 auf Windows XP SP2 Client Maschine: Windows XP SP2 (keine VS2005 installiert)