В Visual Studio я могу скомпилировать свой код, используя /MT или /MD [MSDN]. Думаю, я не понимаю всех последствий, которые имеют эти варианты.
Мое нынешнее понимание таково:
( А) «многопоточная» часть, о которой говорит MSDN, не имеет ничего общего с моим приложением. Мое приложение все еще может быть однопоточным. Это среда выполнения C, способная к многопоточности. Я понимаю это, поскольку «среда выполнения C использует синхронизацию вокруг new, чтобы гарантировать, что несколько потоков не столкнутся с гонкой данных при генерации указателей». Возможно, в прошлом существовала однопоточная версия.
(B) хотя это опции компилятора, технически это больше похоже на связывание. /MD — динамическое «связывание», а /MT — статическое «связывание».
(C) /MD приведет к исполняемый файл меньшего размера, но загружает ucrtbase.dll, который затем загружает библиотеки DLL среды выполнения C, например VCRUNTIME140.dll, VCRUNTIME140_1.dll и MSVCP140.dll (или их отладочные версии). Мне нужна их распространяемая версия, когда я создаю свой установщик.
(D) /MT приведет к созданию более крупного исполняемого файла, но содержит непосредственно среду выполнения C, поэтому нет необходимо загрузить дополнительные DLL.
(E) если у меня большое приложение (например, 5MLoC, 100 собственных DLL), выбор /MD выгоден, поскольку каждая отдельная DLL меньше и вышеупомянутые библиотеки DLL загружаются в процесс только один раз. По сути, я должен скомпилировать как минимум все библиотеки DLL с помощью /MD.
(F) отладочные версии /Mxd среды выполнения C используют другое расположение памяти. и например используйте 0xCCCCCCCC в качестве шаблонов заполнения для обнаружения переполнения/опустошения буфера.
(G) Я не могу смешивать /MD и MT.
(H) /MD определяет _DLL, и программы могут выполнять все виды магии #ifdef _DLL, но, вероятно, им не следует этого делать. Одним из таких примеров является errno, который может быть простым extern int (для /MT), но вызовом функции (для /MD).
(J) с /MT, каждый модуль получает свою собственную кучу CRT, поэтому память должна быть освобождена в модуле, который ей был выделен. (Источник [MSDN])
Правильно ли приведенное выше понимание? Я пропустил важный момент?
Моя цель — понять (J). По пути туда я хочу убедиться, что понял остальную часть темы.
Я прочитал
ссылка на MSDN выше
Что означают MT и MD?
Смешивание кода, скомпилированного с /MT и /MD (который вы невозможно; уже указано в справочнике MSDN)
Почему библиотека времени выполнения является параметр компилятора, а не параметр компоновщика?
Решение LNK4098: библиотека defaultlib 'MSVCRT' конфликтует с
Какую разницу имеют /MD, /MT при компиляции объектные файлы?
В Visual Studio я могу скомпилировать свой код, используя /MT или /MD [MSDN]. Думаю, я не понимаю всех последствий, которые имеют эти варианты. Мое нынешнее понимание таково: [list] [*]( А) «многопоточная» часть, о которой говорит MSDN, не имеет ничего общего с моим приложением. Мое приложение все еще может быть однопоточным. Это среда выполнения C, способная к многопоточности. Я понимаю это, поскольку «среда выполнения C использует синхронизацию вокруг new, чтобы гарантировать, что несколько потоков не столкнутся с гонкой данных при генерации указателей». Возможно, в прошлом существовала однопоточная версия. [*](B) хотя это опции компилятора, технически это больше похоже на связывание. /MD — динамическое «связывание», а /MT — статическое «связывание». [*](C) /MD приведет к исполняемый файл меньшего размера, но загружает ucrtbase.dll, который затем загружает библиотеки DLL среды выполнения C, например VCRUNTIME140.dll, VCRUNTIME140_1.dll и MSVCP140.dll (или их отладочные версии). Мне нужна их распространяемая версия, когда я создаю свой установщик. [*](D) /MT приведет к созданию более крупного исполняемого файла, но содержит непосредственно среду выполнения C, поэтому нет необходимо загрузить дополнительные DLL. [*](E) если у меня большое приложение (например, 5MLoC, 100 собственных DLL), выбор /MD выгоден, поскольку каждая отдельная DLL меньше и вышеупомянутые библиотеки DLL загружаются в процесс только один раз. По сути, я должен скомпилировать как минимум все библиотеки DLL с помощью /MD. [*](F) отладочные версии /Mxd среды выполнения C используют другое расположение памяти. и например используйте 0xCCCCCCCC в качестве шаблонов заполнения для обнаружения переполнения/опустошения буфера. [*](G) Я не могу смешивать /MD и MT. [*](H) /MD определяет _DLL, и программы могут выполнять все виды магии #ifdef _DLL, но, вероятно, им не следует этого делать. Одним из таких примеров является errno, который может быть простым extern int (для /MT), но вызовом функции (для /MD). [*](J) с /MT, каждый модуль получает свою собственную кучу CRT, поэтому память должна быть освобождена в модуле, который ей был выделен. (Источник [MSDN]) [/list] Правильно ли приведенное выше понимание? Я пропустил важный момент? Моя цель — понять (J). По пути туда я хочу убедиться, что понял остальную часть темы. Я прочитал [list] [*]ссылка на MSDN выше [*]Что означают MT и MD? [*]Смешивание кода, скомпилированного с /MT и /MD (который вы невозможно; уже указано в справочнике MSDN) [*]Почему библиотека времени выполнения является параметр компилятора, а не параметр компоновщика? [*]Решение LNK4098: библиотека defaultlib 'MSVCRT' конфликтует с [*]Какую разницу имеют /MD, /MT при компиляции объектные файлы? [*]Следует ли мне компилировать с /MD или /MT? [/list]