Dies ist etwas, das ich einfach blind akzeptiert und als "so wie es ist" gefolgt ist. Ich versuche, das dahinter liegende "Warum" tiefer zu verstehen.Auf der Suche nach einem tieferen Verständnis von Visual Studio C-Laufzeitbibliothek Link-Verhalten
- statische Bibliothek Liba - utulizes einige C-Laufzeit ruft
- statische Bibliothek libb - nutzt einige C-Laufzeit
- ausführbare App nennt - nutzt Liba, libb, und einige C-Laufzeit ruft
Es ist ziemlich gut dokumentiert here und eine Reihe von anderen Orten, die alle Module an einen bestimmten Aufruf des Linkers übergeben wurden mit der gleichen Laufzeitbibliothek Compiler-Option kompiliert worden sein müssen.
Wenn die gesamte Symbolauflösung während des letzten Links für die App ausgeführt wird, wie in den Abschnitten here und here beschrieben, warum ist das der Fall? Warum müssen LibA und LibB sogar eine bestimmte Laufzeitbibliothek angeben, die beim Erstellen verwendet wird? Sollte die C-Laufzeit nicht aufrufen, verwenden sie nur die Auflösung für die Laufzeit, die App für den Link angibt.
Ist dies ein Problem in anderen C-Entwicklungsumgebungen oder ist es spezifisch für Visual Studio?
Die CRT ist einfach nicht sehr kompatibel mit dem Begriff der Module, hat es eine Menge von globalem Zustand. Eine Variable wie errno ist ein gutes Beispiel. Um die Freigabe dieses Status zwischen EXE und DLLs zu ermöglichen, muss die Definition von errno gehackt werden, um zu einem Funktionsaufruf zu werden, so dass der einzige und gemeinsam genutzte Wert erhalten werden kann. Ausgelöst von/MD. Der Versuch, eine OBJ, die auf Fehlern verweist, mit einer anderen zu verknüpfen, die sich auf _errno() bezieht, kann nicht funktionieren.Nicht ganz genau, aber repräsentativ für das Problem. –