Я должен скомпилировать с / MD или / MT?

  1. Ваша ошибка нулевого указателя может быть результатом воссоздания фрагмента, в результате чего значение button_prev недействительно. И первоначальное значение button_prev может быть причиной.
  2. findViewById - это трудоемкая функция. Привязка к представлению должна обрабатываться один раз и только один раз в onCreate ()
  3. Лучше использовать MVC, MVP или MVVM. Пользователь модели для описания вашей игровой логики. Сосредоточьтесь на изменении данных, и интерфейс должен быть изменен вместе с ним.
116
задан andy 16 April 2009 в 18:22
поделиться

6 ответов

By dynamically linking with /MD,

  • you are exposed to system updates (for good or ill),
  • your executable can be smaller (since it doesn't have the library embedded in it), and
  • I believe that at very least the code segment of a DLL is shared amongst all processes that are actively using it (reducing the total amount of RAM consumed).

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).

80
ответ дан 24 November 2019 в 02:17
поделиться

Я считаю, что по умолчанию для проектов, созданных в Visual Studio, используется /MD.

Если вы используете / MT, ваш исполняемый файл не будет зависеть от наличия DLL в целевой системе. Если вы оборачиваете это в установщик, это, вероятно, не будет проблемой, и вы можете пойти по любому пути.

Я сам использую / MT, так что я могу игнорировать весь беспорядок DLL.

PS As г-н. Фуз отмечает, что важно быть последовательным. Если вы связываетесь с другими библиотеками, вам нужно использовать ту же опцию, что и они. Если вы используете стороннюю DLL, почти наверняка вам понадобится DLL-версия библиотеки времени выполнения.

18
ответ дан 24 November 2019 в 02:17
поделиться

Я предпочитаю статически связывать с / MT.

Несмотря на то, что вы получаете меньший исполняемый файл с / MD, вам все равно придется отправить кучу DLL, чтобы убедиться, что пользователь получает правильную версию для запуска вашей программы. И, в конце концов, ваш установщик будет БОЛЬШЕ, чем при связывании с / MT.

Что еще хуже, если вы решите поместить библиотеки времени выполнения в каталог Windows, рано или поздно пользователь собирается установить новое приложение с различными библиотеками и, в случае неудачи, сломать ваше приложение.

14
ответ дан 24 November 2019 в 02:17
поделиться

Проблема, с которой вы столкнетесь с / MD, заключается в том, что целевая версия CRT может отсутствовать на вашем компьютере пользователя. (особенно если вы используете последнюю версию Visual Studio и у пользователя более старая операционная система).

В этом случае вам нужно выяснить, как установить правильную версию на свой компьютер.

8
ответ дан 24 November 2019 в 02:17
поделиться

из 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 ссылки динамически.

7
ответ дан 24 November 2019 в 02:17
поделиться

Если вы используете библиотеки DLL, вам следует выбрать динамически подключаемый CRT (/ MD).

Если вы используете динамическую CRT для своего .exe и всех .dll, тогда все они будут использовать одну реализацию CRT - это означает, что все они будут совместно использовать одну кучу CRT и память, выделенную в одной .exe / .dll может

Если вы используете статический CRT для своего .exe и всех .dll, тогда все они получат отдельную копию CRT - это означает, что все они будут использовать свою собственную кучу CRT, поэтому память должна быть освобождается в том же модуле, в котором он был размещен. Вы также будете страдать от раздувания кода (несколько копий CRT) и чрезмерных накладных расходов времени выполнения (каждая куча выделяет память из ОС, чтобы отслеживать ее состояние, и накладные расходы могут быть заметны).

30
ответ дан 24 November 2019 в 02:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: