Как определить, какие дистрибутивы С++ нужно запускать моей программе?

Возможно ли, что мне нужно установить как vcredist для vs2012 И для vs2010?

У меня просто была ошибка, когда мое приложение не могло загрузить DLL, и оно внезапно начало работать после того, как я сделал несвязанную установку, что побудило меня предположить, что он должен установить более старый vcredist, который исправил проблему. Однако я уверен, что использую функции С++ 11.

Ответы

Ответ 1

Развертывание - это самостоятельная работа. И я ненавижу это, я ненавижу то, как вы должны писать установки в Windows.... Так что теперь чувствую себя лучше...

Вам нужен только один vcredist. Тот, на который линкер решил связать вашу программу. Если у вас установлен "Windows SDK", вы найдете фактический повторный набор в:

C:\Program Files\Microsoft SDKs\Windows\v7.0A\Bootstrapper\Packages\vcredist_x86

Если вы установите все обновления, включая не важные, Microsoft обновит ваш список в этой папке!

Возможно, у вас есть исполняемый файл, который не хочет запускаться, вам нужен зависимый ходок. Инструмент, настолько полезный, что Microsoft пришлось удалить его из Visual Studio. Скачайте программу и откройте свой exe. Вам не нужно понимать, что на самом деле происходит. Пока во время открытия не появляется диалоговое окно, все в порядке, даже если в нижнем окне есть восклицательные знаки. Если в диалоговом окне появляется что-то вроде "Не удалось решить", чем смотреть в нижнем окне. Обычно в нижнем окне есть что-то вроде msscr.dll или msvcr100.dll или msvcr110.dll. Если он содержит "d" перед расширением типа "msvcr100d.dll", исполняемый файл был скомпилирован в режиме отладки, и ваше путешествие заканчивается в системе без установленного компилятора. Если нет, имя сообщает вам, какой vcredist вам нужен:

msvcr100 = VS 2010 redist (32bit) (64 бит)

msvcr110 = VS 2012 redist (32/64bit?)

иногда это не msvcr, но всегда начинается с ms. Конечно, программа сообщит вам, что каждая dll отсутствует, а не только микрософт и какая команда в dll используется. Это иногда чрезвычайно полезно. Вы должны сделать это с каждой dll в папке вашего исполняемого файла, так как они также могут иметь неразрешимые зависимости.
Вернемся к первому вопросу. Ваша программа может подключаться только к msvcr100 или msvcr110, а не к обоим, поэтому вам нужен только один vcredist для каждого исполняемого файла. Как уже упоминалось в комментарии, сторонняя DLL может быть виновна в использовании другой версии msvcp. Так что да, вам нужно искать всю DLL, которую вы используете, и вам нужно установить оба vcredist несколько раз.

PS: всегда есть как минимум два из них: msvcr и msvcp.

Ответ 2

Я решил эту проблему следующим образом (в Windows 7):

  • Я попытался загрузить библиотеку и не смог показать "Приложение не запускалось, потому что его бок о бок информация неверна".
  • Я открыл окно "Управление компьютером": "Пуск" → щелкните правой кнопкой мыши "Компьютер- > Управление".
  • В окне "Управление компьютером" я выбрал "Event Viewer" → "Журналы Windows" → "Приложение".
  • Журнал, соответствующий ошибке, сказал, что DLL для определенной версии Microsoft.VC90.CRT не найден. В моем случае версия была 9.0.30729.6161, и поиск в Google показал, что мне нужно установить "необычную" версию распространяемых из здесь.

Ходок-манипулятор не помог мне (он меня только путал, сообщая о ненужных зависимостях).

Ответ 3

Если ваша ОС Vista или новее (а не XP), используйте встроенный файл SxStrace.exe для генерации журнала загрузки DLL и того, что требуется для этого модуля. Это ясно покажет вам, загружается ли несколько версий DLL CRT, и для какой DLL (сторонняя сторона или нет).

Распространяемый VS2012 помещается в, например, "C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\redist".

- Дэвид