By dynamically linking with /MD,
I've also found that in practice, when working with statically-linked 3rd-party binary-only libraries that have been built with different runtime options, /MT in the main application tends to cause conflicts much more often than /MD (because you'll run into trouble if the C runtime is statically-linked multiple times, especially if they are different versions).
Я считаю, что по умолчанию для проектов, созданных в Visual Studio, используется /MD.
Если вы используете / MT, ваш исполняемый файл не будет зависеть от наличия DLL в целевой системе. Если вы оборачиваете это в установщик, это, вероятно, не будет проблемой, и вы можете пойти по любому пути.
Я сам использую / MT, так что я могу игнорировать весь беспорядок DLL.
PS As г-н. Фуз отмечает, что важно быть последовательным. Если вы связываетесь с другими библиотеками, вам нужно использовать ту же опцию, что и они. Если вы используете стороннюю DLL, почти наверняка вам понадобится DLL-версия библиотеки времени выполнения.
Я предпочитаю статически связывать с / MT.
Несмотря на то, что вы получаете меньший исполняемый файл с / MD, вам все равно придется отправить кучу DLL, чтобы убедиться, что пользователь получает правильную версию для запуска вашей программы. И, в конце концов, ваш установщик будет БОЛЬШЕ, чем при связывании с / MT.
Что еще хуже, если вы решите поместить библиотеки времени выполнения в каталог Windows, рано или поздно пользователь собирается установить новое приложение с различными библиотеками и, в случае неудачи, сломать ваше приложение.
Проблема, с которой вы столкнетесь с / MD, заключается в том, что целевая версия CRT может отсутствовать на вашем компьютере пользователя. (особенно если вы используете последнюю версию Visual Studio и у пользователя более старая операционная система).
В этом случае вам нужно выяснить, как установить правильную версию на свой компьютер.
из http://msdn.microsoft.com/en-us/library/2kzt1wy3 (VS. 71) .aspx :
/ MT Определяет _MT, чтобы многопоточные версии подпрограмм времени выполнения выбирались из файлов стандартного заголовка (.h). Эта опция также заставляет компилятор поместить имя библиотеки LIBCMT.lib в файл .obj, чтобы компоновщик использовал LIBCMT.lib для разрешения внешних символов. Для создания многопоточных программ требуется / MT или / MD (или их отладочные эквиваленты / MTd или / MDd).
/ MD Определяет _MT и _DLL, так что для многопоточных и DLL-специфичных версий подпрограмм времени выполнения выбираются из стандартных файлов .h. Эта опция также заставляет компилятор поместить имя библиотеки MSVCRT.lib в файл .obj.
Приложения, скомпилированные с этой опцией, статически связаны с MSVCRT.lib. Эта библиотека предоставляет слой кода, который позволяет компоновщику разрешать внешние ссылки. Фактический рабочий код содержится в MSVCR71.DLL, который должен быть доступен во время выполнения приложениям, связанным с MSVCRT.lib.
Когда / MD используется с определенным _STATIC_CPPLIB (/ D_STATIC_CPPLIB), это заставит приложение связываться с статическая многопоточная стандартная библиотека C ++ (libcpmt.lib) вместо динамической версии (msvcprt.lib) при динамическом связывании с основным CRT через msvcrt.lib.
Так что, если я правильно его интерпретирую, тогда / MT ссылки статически и / MD ссылки динамически.
Если вы используете библиотеки DLL, вам следует выбрать динамически подключаемый CRT (/ MD).
Если вы используете динамическую CRT для своего .exe и всех .dll, тогда все они будут использовать одну реализацию CRT - это означает, что все они будут совместно использовать одну кучу CRT и память, выделенную в одной .exe / .dll может
Если вы используете статический CRT для своего .exe и всех .dll, тогда все они получат отдельную копию CRT - это означает, что все они будут использовать свою собственную кучу CRT, поэтому память должна быть освобождается в том же модуле, в котором он был размещен. Вы также будете страдать от раздувания кода (несколько копий CRT) и чрезмерных накладных расходов времени выполнения (каждая куча выделяет память из ОС, чтобы отслеживать ее состояние, и накладные расходы могут быть заметны).