MD MDd MTd MT
-
Hallo allerseits,
mit den compiler- / linkerswitches MD MDd MTd MT kann man den msvc-compiler/linker anweisen, die .exe(dll) gegen eine bestimmten c-laufzeitlib zu linken.
ich schaue schon seit einer geraumen weile im netz herum, um etwas licht in dieses laufzeitbibliothekenthema zu bekommen. mittlerweile ist mir das wesen dieser switches einigermassen klar (obwohl das mit den .manifest noch eine hefty komponente bekommen hat ...) - und auch einen vagen begriff davon, was man dabei falsch machen kann (http://www.google.de/search?q=Q140584)
aber eine frage bleibt unbeantwortet:
wennn man die wahl hat,welche bindet man ein, und WARUM?ok, die debug-versionen unterstützen beim auffinden von speicherfehlern, aber was sind die kriterien, um zwischen statisch (MT) und dynamisch (MD) zu entscheiden?
vielen dank für jeden hinweis,
hendrik
-
Bei statisch wird die Exe größer, bei dynamisch musst du die passenden dlls mitgeben.
-
henniman schrieb:
wennn man die wahl hat,welche bindet man ein, und WARUM?
Wenn Du keine Probleme mit den maniftests haben willst nimmst Du die statische Version...
Microsoft empfiehlt aber die DLL aus den folgenden Gründen:
- Wenn die SxS oder System32-DLL verwendet wird, dann kann Microsoft diese Dateien z.B. bei Sicherheitsproblemen updaten
- Falls Du managed Anwendungen schreibst, so kannst Du nur die DLL verwenden (hat was mit dem ehemaligen loader-lock bug zu tun)
[/quote]Wenn Du also vorhast die DLL mit Deiner Anwendung auszuliefern (also *nicht* als SxS sonder als App-Local), dann rate ich Dir zur statischen Version.
Die DLL-CRT benötigst Du auch, wenn Du Objekte / Klassen zwischen Deiner EXE und DLLs sharesched (schönes Deutsch!) (z.B. CString).
-
ahh das beleuchtet schon einiges, danke!
mich beschäftigt eine frage, was die heaps angeht:
angenommen ich habe
- lib A
- app B, linkt gegen lib Abeide sind
a: statisch (libcmt)
b: dynamisch (msvcrt)hat die lib A in fall a jetzt einen
eigenen heap? gibt es in fall a mehrere
heaps?hendrik
-
Wenn Du eine LIB linkest (also zu einer DLL oder EXE), dann musst Du bei *beiden* immer die gleichen Einstellungen verwenden, sonst bekommst DU ganz, ganz viele Linker Fehler...
-
ja, die geschichte mit /NODEFAULTLIB und so kenne ich schon. damit bekommt man den linker zum schweigen. Meine Frage ist eher, ob ich durch das verwenden von 2x libcmt in verschiedenen .obj (oder libs) mehrere heaps bekomme.
überall steht, das man solche probleme erzeugt, wenn dll und exe mit libcmt gelinkt sind. wenn aber meine libs alle statisch eingebunden werden, hat das programm dann nur einen heap? gibt es eigentlich tools, mit denen man so etwas 'inspecten' kann?
-
Eine LIB kann nicht eigenständig leben... somit brauchst Du immer eine DLL oder EXE dazu. Und erst diese initialisert dann die CRT. Somit hast Du dann auch nur *eine* CRT.
Was das "schweigen des Linkers" anbelangt: Ich rate dringend davon ab. Damit macht man sich mehr Probleme und bekämpft nur die Symptome nicht aber die eigentliche Ursache...