W programie Visual Studio dostępne są flagi kompilacji / MD i / MT, które pozwalają wybrać rodzaj biblioteki środowiska uruchomieniowego C.
Rozumiem różnicę we wdrożeniu, ale nadal nie jestem pewien, którego użyć. Jakie są zalety / wady?
Słyszałem, że jedną z zalet / MD jest to, że pozwala to komuś zaktualizować środowisko wykonawcze (na przykład załatać problem z bezpieczeństwem), a moja aplikacja skorzysta na tej aktualizacji. Chociaż wydaje mi się, że to prawie nie jest funkcja: nie chcę, aby ludzie zmieniali moje środowisko wykonawcze bez pozwolenia mi na testowanie w nowej wersji!
Kilka rzeczy, które mnie interesują:
- Jak wpłynęłoby to na czas budowy? (prawdopodobnie / MT jest trochę wolniejszy?)
- Jakie są inne konsekwencje?
- Którego używa większość ludzi?
Odpowiedzi:
Poprzez dynamiczne łączenie z / MD,
Odkryłem również, że w praktyce podczas pracy ze statycznie połączonymi bibliotekami binarnymi innych firm, które zostały zbudowane z różnymi opcjami uruchomieniowymi, / MT w głównej aplikacji ma tendencję do powodowania konfliktów znacznie częściej niż / MD (ponieważ wpadną w kłopoty, jeśli środowisko wykonawcze C jest wielokrotnie połączone statycznie, zwłaszcza jeśli są to różne wersje).
źródło
/MT
będzie nieco szybszy w czasie wykonywania, ponieważ Twoja aplikacja nie musi za każdym razem wyszukiwać implementacji funkcji wykonawczej, nie jestem ekspertem na tym poziomie, ale jestem prawie pewien Systemy operacyjne będą buforować implementacje środowiska wykonawczego, więc Twoja aplikacja będzie używać wersji buforowanej, więc różnica nie będzie tak duża, UWAGA, wspomniałem, że nie jestem pewien, więc nie traktuj tego komentarza jako argumentu.Jeśli używasz bibliotek DLL, powinieneś wybrać dynamicznie połączony CRT (/ MD).
Jeśli korzystasz z dynamicznego CRT dla swojego pliku .exe i wszystkich plików .dll, wszystkie będą współużytkować jedną implementację CRT - co oznacza, że wszyscy będą współdzielić jedną stertę CRT, a pamięć przydzielona w jednym pliku .exe / .dll może zostać zwolniona w inne.
Jeśli używasz statycznego CRT dla swojego .exe i wszystkich plików .dll, wszyscy otrzymają oddzielną kopię CRT - co oznacza, że wszyscy będą używać własnej sterty CRT, więc pamięć musi zostać zwolniona w tym samym module, w którym jest został przydzielony. Będziesz także cierpieć z powodu rozdęcia kodu (wiele kopii CRT) i nadmiernego obciążenia środowiska uruchomieniowego (każda sterta przydziela pamięć z systemu operacyjnego, aby śledzić jej stan, a obciążenie może być zauważalne).
źródło
Uważam, że domyślnym ustawieniem dla projektów utworzonych za pomocą programu Visual Studio jest / MD.
Jeśli używasz / MT, Twój plik wykonywalny nie będzie zależał od biblioteki DLL obecnej w systemie docelowym. Jeśli pakujesz to w instalator, prawdopodobnie nie będzie to problemem i możesz to zrobić.
Sam używam / MT, więc mogę zignorować cały bałagan DLL.
PS Jak podkreśla pan Fooz , należy być konsekwentnym. Jeśli łączysz się z innymi bibliotekami, musisz użyć tej samej opcji, co oni. Jeśli używasz biblioteki DLL innej firmy, prawie pewne jest, że będziesz musiał użyć wersji DLL biblioteki wykonawczej.
źródło
Wolę łączyć się statycznie z / MT.
Nawet jeśli otrzymujesz mniejszy plik wykonywalny z / MD, nadal musisz wysłać kilka bibliotek DLL, aby upewnić się, że użytkownik otrzyma odpowiednią wersję do uruchomienia programu. Ostatecznie twój instalator będzie WIĘKSZY niż podczas łączenia z / MT.
Co gorsza, jeśli zdecydujesz się umieścić swoje biblioteki wykonawcze w katalogu windows, wcześniej czy później użytkownik zainstaluje nową aplikację z różnymi bibliotekami i przy odrobinie szczęścia zepsuje aplikację.
źródło
Problem, na który napotkasz z / MD, polega na tym, że docelowa wersja CRT może nie znajdować się na komputerze użytkownika (zwłaszcza jeśli używasz najnowszej wersji programu Visual Studio, a użytkownik ma starszy system operacyjny).
W takim przypadku musisz dowiedzieć się, jak pobrać odpowiednią wersję na ich komputer.
źródło
z http://msdn.microsoft.com/en-us/library/2kzt1wy3(VS.71).aspx :
Więc jeśli interpretuję to poprawnie, wtedy / MT łączy statycznie, a / MD łączy się dynamicznie.
źródło
Jeśli budujesz plik wykonywalny, który używa innych bibliotek dll lub bibliotek niż / MD, preferowana jest opcja, ponieważ w ten sposób wszystkie komponenty będą współużytkować tę samą bibliotekę. Oczywiście ta opcja powinna pasować do wszystkich zaangażowanych modułów, tj. Dll / lib / exe.
Jeśli Twój plik wykonywalny nie używa żadnej biblioteki lib lub dll, to jego czyjeś wywołanie. Różnica nie jest teraz zbyt duża, ponieważ aspekt udostępniania nie ma znaczenia.
Więc może możesz uruchomić aplikację za pomocą / MT, ponieważ nie ma ważnego powodu, aby inaczej, ale kiedy nadejdzie czas na dodanie biblioteki lib lub dll, możesz zmienić ją na / MD za pomocą lib / dll, co jest łatwe.
źródło