Einer der vielen Hauptunterschiede zwischen C ++ Compilers GCC & amp; MSVC ist, dass in der ersten alle Symbole aus einer gemeinsam genutzten Bibliothek standardmäßig exportiert werden, während MSVC nichts exportiert.
Einige Implikationen sind das in, In MSVC müssen Sie explizite explizite Vorlagenklassen exportieren.
Obwohl ich dies als eine Tatsache des Lebens akzeptiert habe, habe ich mich gefragt, was sind die Design-Implikationen, Trade-Offs, aus der Perspektive eines Compiler-Designers usw. für jeden Ansatz?
Es hat wahrscheinlich etwas damit zu tun, was ausführbare Dateien und Bibliotheken in ihrem jeweiligen Betriebssystem sind.
Unter Windows sind sowohl Bibliotheken (DLL) als auch ausführbare Dateien identisch. Buchstäblich können Sie eine .dll in .exe umbenennen, und es wird den Stub des geschützten Modus ausführen und einen Fehler ausgeben (wieder geschützter Modus, so dass es nur auf einem 16-Bit-System funktioniert). Angesichts der Tatsache, dass es sich um dieselben handelt und Sie Symbole aus tatsächlichen ausführbaren Dateien exportieren können (und dies auch tun), sollten Sie davon ausgehen, dass der Standardwert kein richtiger Export ist?
Unter Linux jedoch sind ausführbare Dateien ihr eigenes Ding, und Code-Bibliotheken (gemeinsame Objekte, .so) sind etwas anderes. In der Tat .so Dateien sind näher an Archiven (.a, Art von GCC-Bibliotheken - aber sind nicht wirklich Archive ), wenn ich mich richtig erinnere. Es ist nicht erforderlich, dass eine .lib-Datei zur Verwendung der gemeinsam genutzten Bibliothek wie in Windows hinzugefügt wird, da es sich bei um eine Bibliotheksdatei handelt. Angesichts der Tatsache, dass Sie Ihre Ausgabe explizit als diese gemeinsam genutzte Bibliothek kompilieren, sehe ich wirklich nichts Seltsames darin, einfach nur alles standardmäßig zu exportieren.
Tags und Links c++ gcc visual-c++ msvc12