Projektteile mit verschiedenen Windows-SDK Versionen. Möglich?
-
Hallo Gemeinde,
kann ich eine statische lib (Kompiliert mit zB SDK 8.1) in ein Projekt einbinden das mit einer neueren SDK erstellt wird? Ich vermute die Antwort lautet nein.
MSVC 2022 (=Toolset v143) ist Binärkompatibel runter bis MSVC 2015 (=Toolset v140).
Gibt es so eine Kompatibilität auch bei dem Kompilieren gegen verschiedene SDK Versionen? Oder müssen alle Projektanteile mit exakt der gleichen SDK Version (zb SDK 10.17134.0) kompiliert worden sein.Vielen Dank
-
Verschiedene WinSDK Versionen ist kein Problem, so lange überall das selbe "Target" verwendet wird (
_WIN32_WINNT
).Und selbst verschiedene Target-Versionen sind meistens kein Problem.
Es kann ein Problem geben, wenn die lib an "problematischen Stellen" WinAPI structs verwendet. Und auch nur dann, wenn es "versionierte" WinAPI structs sind. Typischerweise sind das welche mit einem
dwSize
/cbSize
Feld. Diese können sich von Windows Version zu Windows Version unterscheiden.Also beispielsweise
RECT
oderPOINT
sind unproblematisch - die sind immer gleich.
Beispiele für potentiell problematische structs wärenOPENFILENAMEA
oderWNDCLASSEXW
.Und problematische Stellen wären z.B.:
- Parameter oder Returnwerte von Funktionen die du aufrufst
- Member von Klassen/structs der Lib die dein Programm direkt oder indirekt verwendet
- Inline Code
Beispiel:
namespace FooLib { WNDCLASSEXW MakeWindowClass(); void DefineMainWindowClass(WNDCLASSEXW const& wc); class Bar { // ... private: OPENFILENAMEA m_ofn; }; class Baz { // ... private: Bar m_bar; }; inline void DoSomething() { WNDCLASSEXW wc = {}; // ... } }
Alle hier gezeigten Funktionen/Klassen wären potentiell problematisch.
Einfach gesagt ist der Grund warum es hier potentiell zu Problemen kommen kann dass die ODR verletzt wird: unterschiedliche Programmteile verwenden unterschiedliche Definitionen der selben struct.
Wenn solche versionierten structs gar nicht verwendet werden, gibt es logischerweise kein Problem, weil es auch keine ODR Verletzung gibt.
Und wenn solche structs von der lib verwendet werden, aber nur intern, dann gibt es in der Praxis auch kein Problem. Nichtmal wenn dein Programm die selben structs verwendet - so lange beide Verwendungen völlig unabhängig voneinander bleiben. (Formell ist das in C++ zwar auch eine ODR Verletzung, aber effektiv wird halt kein Problem draus.)