В 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 (или их отладочные версии). Мне нужна их распространяемая версия, когда я создаю свой установщик (vcredist [MSDN]).
(D) /MT приведет к созданию исполняемого файла большего размера, но содержит C напрямую во время выполнения, поэтому не нужно загружать дополнительные библиотеки DLL.
(E) если у меня большое приложение (например, 5MLoC, 100 собственных DLL), выбор /MD Это выгодно, поскольку каждая отдельная DLL меньше, а вышеупомянутые библиотеки DLL загружаются в процесс только один раз. По сути, я должен скомпилировать как минимум все библиотеки DLL с помощью /MD.
(F) отладочные версии /Mxd среды выполнения C используют другое расположение памяти. и например используйте 0xCCCCCCCC в качестве шаблонов заполнения для обнаружения переполнения/опустошения буфера.
(G) Я не могу смешивать /MD и MT на этапе компиляции.
(G) Я не могу смешивать /MD и MT на этапе компиляции.
(G) li>
(H) /MD определяет _DLL, и программы могут выполнять все виды магии #ifdef _DLL, но, вероятно, им не следует этого делать. Одним из таких примеров является errno, который может быть простым extern int (для /MT), но вызовом функции (для /MD).
(J) с /MT, каждый модуль получает свою собственную кучу CRT, поэтому память должна быть освобождена в модуле, который ей был выделен. (Источник [MSDN] и [Источник [MSDN]] (потенциальные ошибки при передаче объектов CRT через границы DLL))
Правильно ли это понимание? Я пропустил важный момент?
Моя цель — понять (J). По пути я хочу убедиться, что понял остальную часть темы.
Я прочитал
ссылка на MSDN выше.
Что означают MT и MD?
Смешивание кода, скомпилированного с /MT и /MD (что вы можете 't; уже указано в справочнике 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 (или их отладочные версии). Мне нужна их распространяемая версия, когда я создаю свой установщик (vcredist [MSDN]). [*](D) /MT приведет к созданию исполняемого файла большего размера, но содержит C напрямую во время выполнения, поэтому не нужно загружать дополнительные библиотеки DLL. [*](E) если у меня большое приложение (например, 5MLoC, 100 собственных DLL), выбор /MD Это выгодно, поскольку каждая отдельная DLL меньше, а вышеупомянутые библиотеки DLL загружаются в процесс только один раз. По сути, я должен скомпилировать как минимум все библиотеки DLL с помощью /MD. [*](F) отладочные версии /Mxd среды выполнения C используют другое расположение памяти. и например используйте 0xCCCCCCCC в качестве шаблонов заполнения для обнаружения переполнения/опустошения буфера. [*](G) Я не могу смешивать /MD и MT на этапе компиляции. [*](G) Я не могу смешивать /MD и MT на этапе компиляции. [*](G) li> (H) /MD определяет _DLL, и программы могут выполнять все виды магии #ifdef _DLL, но, вероятно, им не следует этого делать. Одним из таких примеров является errno, который может быть простым extern int (для /MT), но вызовом функции (для /MD). [*](J) с /MT, каждый модуль получает свою собственную кучу CRT, поэтому память должна быть освобождена в модуле, который ей был выделен. (Источник [MSDN] и [Источник [MSDN]] (потенциальные ошибки при передаче объектов CRT через границы DLL)) [/list] Правильно ли это понимание? Я пропустил важный момент? Моя цель — понять (J). По пути я хочу убедиться, что понял остальную часть темы. Я прочитал [list] [*]ссылка на MSDN выше. [*]Что означают MT и MD? [*]Смешивание кода, скомпилированного с /MT и /MD (что вы можете 't; уже указано в справочнике MSDN) [*]Почему библиотека времени выполнения является параметр компилятора, а не параметр компоновщика? [*]Решение LNK4098: библиотека defaultlib 'MSVCRT' конфликтует с [*]Какую разницу имеют /MD, /MT при компиляции объектные файлы? [*]Следует ли мне компилировать с /MD или /MT? [/list]