Wie man die Zielversion des Betriebssystems richtig einstellt, wenn eine Bibliothek unter Windows mit dem Visual C ++ - Compiler erstellt wird
Ich erstelle eine plattformübergreifende Bibliothek mithilfe des Visual C ++ 2013-Compilers mit C ++ 11-Funktionen auf der Windows-Plattform und verwende CMake (NMake-Generator) als Build-System. Ich benutze Windows 7.
Meine Bibliothek verwendet einige Funktionen / Aufzählungswerte / Strukturelemente, die nur in Windows 8/7 verfügbar sind.
Ich möchte in der Lage sein, die Bibliothek für Windows XP, Windows Vista, Windows 7 und Windows 8 / 8.1 sowie für x86-, x64- und arm-Architekturen zu erstellen, dh nicht für einen einzigen Build, der nur auf Windows XP abzielt und überall funktioniert, sondern für viele Verschiedene Builds für bestimmte Betriebssysteme, da neuere Betriebssystemversionen weitere nützliche Funktionen bieten, die meine Bibliothek bieten könnte.
Meine Fragen sind:
Wie kann ich dem Compiler mitteilen, dass er auf eine bestimmte Betriebssystemversion (z. B. XP, Vista, 7, 8, 8.1 usw.) abzielen soll?
Wie kann ich dem Compiler mitteilen, dass er auf eine bestimmte Architektur abzielen soll (z. B. x86, x64, arm usw.)?
Was passiert, wenn ich Funktionen / Aufzählungswerte / Strukturelemente verwende, die nur in Windows 8/7 verfügbar sind, aber meine Bibliothek für Windows XP erstelle? Würde der Compiler mich warnen, dass solche Dinge unter Windows XP nicht existieren? Oder würde es tatsächlich kompiliert, aber auf dem Windows XP-System nicht ausgeführt?
Wie mache ich das, wenn ich für Windows XP kompiliere? Mein Code überspringt Dinge, die in Windows XP nicht vorhanden sind (Windows 7/8-Funktionen und so weiter).
Ist es wichtig, welche Windows SDK-Version ich für das Targeting verschiedener Betriebssystemversionen verwende? Ich habe anscheinend Windows SDKs für 8.1, 8.0 und 7.1 installiert. Ist es in Ordnung, wenn ich auch unter Windows XP immer die neueste SDK-Version verwende?
Hier sind einige Antworten, die ich gefunden habe und die ich nicht sicher bin, ob sie richtig oder vollständig sind:
Ich muss nur @ setz_WIN32_WINNT
undWINVER
definiert zuangemessene Werte für das Zielsystem und das war's, ich muss nichts weiter einstellen, meine Anwendung läuft auf dem angegebenen System (d. h. Windows XP) mit genau dem.
Ich muss auch @ angebangemessen/SUBSYSTEM
Wer an den Linker, d. h./SUBSYSTEM:WINDOWS,5.02
oder/SUBSYSTEM:WINDOWS,6.00
für x64. Aber was ist der Unterschied zwischen5.02
und6.00
? Warum geben zwei Werte dasselbe an (64-Bit-Wert)? Gleiches für5.01
und6.00
, warum geben beide 32-Bit-Werte an? Ich würde mir vorstellen, einen einzigen Wert für 64/32 Bit zu haben.
5.01
, 5.02
und6.00
) ähnelt den Plattformwerten vonWINVER
von (1). Stellen sie neben der Architektur auch das Ziel-Betriebssystem ein? AberWINVER=502
from (1) wird verwendet, um auf Windows Server 2003 abzuzielen, das laut Wikipedia sowohl in 64-Bit- als auch in 32-Bit-Versionen veröffentlicht wurde. Hier steht 5.02 jedoch strikt für 64-Bit, was keinen Sinn ergibt.Compiler kann nicht kompiliert werden, da dasWINVER
define from (1) würde Funktionen und Dinge ausschließen, die im Targeting-Betriebssystem nicht vorhanden sind (Windows-Header-Dateien verwenden, die define to#ifdef
Dinge).
Ich sollte#ifdef
Dinge basierend aufWINVER
in meinem eigenen Code, wie Windows-Header, und bieten bei Bedarf Alternativen für die fehlende Funktionalität.
Weiß nicht.
Bitte beachten Sie, dass ich keine Visual Studio-IDE verwende. Die Aufforderung, Option X in der IDE festzulegen, ist daher etwas bedeutungslos.
Ich komme aus der Linux-Entwicklung, daher sind Windows-Dinge für mich etwas neu.