Мое нынешнее понимание таково:
- ( А) «многопоточная» часть, о которой говорит 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 при компиляции объектные файлы?
- Следует ли мне компилировать с /MD или /MT?
Подробнее здесь: https://stackoverflow.com/questions/793 ... ler-option