В Visual Studio есть флаги компиляции / MD и / MT, которые позволяют вам выбрать, какой тип библиотеки времени выполнения C.
Я понимаю разницу в реализации, но все еще не уверен, какую из них использовать. Какие плюсы / минусы?
Одно из преимуществ / MD, о котором я слышал, заключается в том, что это позволяет кому-то обновлять среду выполнения (например, исправлять проблему безопасности), и мое приложение получит выгоду от этого обновления. Хотя для меня это почти не похоже на функцию: я не хочу, чтобы люди меняли мою среду выполнения, не позволяя мне протестировать новую версию!
Некоторые вещи, которые мне любопытны:
- Как это повлияет на время сборки? (предположительно / MT немного медленнее?)
- Какие еще последствия?
- Какой из них использует большинство людей?
Ответы:
Динамически связываясь с / MD,
Я также обнаружил, что на практике при работе со статически связанными сторонними библиотеками, предназначенными только для двоичных файлов, которые были созданы с разными параметрами времени выполнения, / MT в основном приложении имеет тенденцию вызывать конфликты гораздо чаще, чем / MD (потому что вы возникнут проблемы, если среда выполнения C будет статически связана несколько раз, особенно если это разные версии).
источник
/MT
, что во время выполнения будет немного быстрее, поскольку вашему приложению не нужно каждый раз искать реализацию функции времени выполнения, я не эксперт на этом уровне, но я почти уверен, что большая часть ОС будут кэшировать реализации среды выполнения, поэтому ваше приложение будет использовать кешированную версию, поэтому разница будет не такой уж большой. ПРИМЕЧАНИЕ. Я упомянул, что не уверен, поэтому не принимайте этот комментарий в качестве аргумента.Если вы используете библиотеки DLL, вам следует выбрать динамически подключаемый CRT (/ MD).
Если вы используете динамический CRT для своего .exe и всех .dll, тогда все они будут использовать одну реализацию CRT - это означает, что все они будут совместно использовать одну кучу CRT, а память, выделенная в одном .exe / .dll, может быть освобождена в другой.
Если вы используете статический CRT для своего .exe и всех .dll, тогда все они получат отдельную копию CRT - это означает, что все они будут использовать свою собственную кучу CRT, поэтому память должна быть освобождена в том же модуле, в котором она был выделен. Вы также будете страдать от раздувания кода (несколько копий CRT) и избыточных накладных расходов времени выполнения (каждая куча выделяет память из ОС, чтобы отслеживать ее состояние, и накладные расходы могут быть заметны).
источник
Я считаю, что по умолчанию для проектов, созданных с помощью Visual Studio, / MD.
Если вы используете / MT, ваш исполняемый файл не будет зависеть от библиотеки DLL в целевой системе. Если вы обертываете это в установщике, это, вероятно, не будет проблемой, и вы можете пойти в любом случае.
Я сам использую / MT, так что могу игнорировать весь беспорядок DLL.
PS Как отмечает г-н Фуз , очень важно быть последовательным. Если вы связываетесь с другими библиотеками, вам нужно использовать ту же опцию, что и они. Если вы используете стороннюю DLL, почти наверняка вам понадобится DLL-версия библиотеки времени выполнения.
источник
Я предпочитаю связывать статически с / MT.
Несмотря на то, что вы получаете исполняемый файл меньшего размера с / MD, вам все равно придется отправить кучу DLL, чтобы убедиться, что пользователь получает правильную версию для запуска вашей программы. И, в конце концов, ваш установщик будет БОЛЬШЕ, чем при связывании с / MT.
Что еще хуже, если вы решите поместить свои библиотеки времени выполнения в каталог Windows, рано или поздно пользователь установит новое приложение с другими библиотеками и, если не повезет, сломает ваше приложение.
источник
Проблема, с которой вы столкнетесь с / MD, заключается в том, что целевая версия CRT может не находиться на вашем компьютере пользователя (особенно если вы используете последнюю версию Visual Studio и у пользователя более старая операционная система).
В этом случае вам нужно выяснить, как установить нужную версию на их машину.
источник
из http://msdn.microsoft.com/en-us/library/2kzt1wy3(VS.71).aspx :
Итак, если я правильно интерпретирую, то / MT связывает статически, а / MD - динамически.
источник
Если вы создаете исполняемый файл, который использует другие dll или библиотеки, чем параметр / MD, предпочтительнее, потому что в этом случае все компоненты будут использовать одну и ту же библиотеку. Конечно, этот параметр должен соответствовать всем задействованным модулям, например dll / lib / exe.
Если ваш исполняемый файл не использует никаких библиотек или DLL, чем его чей-либо вызов. Сейчас разница не так велика, потому что аспект обмена не играет роли.
Так что, возможно, вы можете запустить приложение с помощью / MT, поскольку в противном случае нет веских причин, но когда пришло время добавить библиотеку или dll, вы можете изменить ее на / MD с помощью библиотеки lib / dll, что легко.
источник