Понимание разницы и значения параметров компилятора /MT и /MDC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Понимание разницы и значения параметров компилятора /MT и /MD

Сообщение Anonymous »

В 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 при компиляции объектные файлы?
  • Следует ли мне компилировать с /MD или /MT?


Подробнее здесь: https://stackoverflow.com/questions/793 ... ler-option
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»