Как заставить C++ компилятор использовать конкретную версию CRT?

Я использую VS2008 для разработки COM DLL, которая по умолчанию использует CRT версии 9, но я использую TSF (Text Service Framework), который не совместим с новым CRT. Я думаю, что решение состоит в том, чтобы использовать совместимую, так как я могу указать версию CRT?

4 ответа

Решение

Я искренне присоединяюсь к рекомендации не менять вручную версию CRT, на которую вы ссылаетесь. Однако, если по какой-то причине (которую я не могу себе представить) это правильный курс действий для вас, способ сделать это - изменить манифест для вашего проекта.

Сначала убедитесь, что манифест не генерируется в каждой сборке (на VS2005: Свойства конфигурации /Linker/ Файл манифеста / Создать манифест), так как он перезапишет изменения, внесенные вами вручную. Также убедитесь, что изоляция включена. Затем найдите файл манифеста - должен быть в $(IntDir) (например, Debug). Вы должны увидеть раздел, похожий на -

  <dependency>
    <dependentAssembly>
      <assemblyIdentity type='win32' name='Microsoft.VC80.DebugCRT' version='8.0.50727.762' processorArchitecture='x86' publicKeyToken='1fc8b3b9a1e18e3b' />
    </dependentAssembly>
  </dependency>

(Для отладочных сборок, конечно). Вам необходимо отредактировать атрибуты version и publicKeyToken элемента CRT. Вы можете проверить файлы в вашей локальной папке WINDOWS\WinSxS, чтобы увидеть доступные версии. Проверьте здесь, как извлечь publicKeyToken, как только вы найдете нужную версию. (Хотя я сначала попробую взглянуть непосредственно на манифесты других проектов, ссылаясь на желаемую CRT-версию).

Если вы идете туда, ожидайте немного грубой воды. Возможно, вам повезет, если ваше приложение является консольным приложением, которое не связывается с другими параллельными компонентами (MFC, OpenMP и т. Д.). Если ваше приложение нетривиально, я бы удивился, если бы между компонентами SxS не было каких-либо сложных зависимостей версий.

(отредактируйте) Вам также необходимо распространять вместе с вашим приложением конкретный CRT, который вы используете. Вот кто-то, кто сделал это.

Самый простой способ будет создать вашу DLL с версией VC++, которая использует CRT, совместимый с TFS.

Я не думаю, что будет хорошей идеей просто связать вашу DLL с другой версией CRT, если только вы не используете ту же версию заголовочных файлов. И самый простой способ сделать это - использовать правильную версию VC++...

Если вы все еще хотите попробовать, вы можете:

  • перейдите в "Настройки конфигурации-> Линкер-> Ввод-> Игнорировать определенную библиотеку" и введите crt, который вы используете (libc.lib, libcmt.lib и т. д., см. эту статью проекта кода для деталей).
  • Введите имя версии CRT, которую вы хотите использовать, в "Параметры конфигурации-> Компоновщик-> Ввод-> Дополнительные зависимости" и его путь в "Конфигурационные параметры-> Компоновщик-> Общие-> Дополнительные каталоги библиотеки".

Вы также можете попробовать изменить каталоги по умолчанию в "Инструменты-> Параметры-> Проекты и решения-> Каталоги VC++-> Библиотечные файлы". Может быть, изменение $(VCInstallDir)lib на путь, по которому находится другая версия CRT, сработает

Не пытайтесь использовать VS9 и ссылаться на другую версию CRT.

Если вам нужно, чтобы ваше приложение связывалось с другим CRT, скажем, CRT VS8, то вы должны скомпилировать и связать свое приложение в этой версии VS.

Решение работало для меня с Visual Studio Express 2013 x64 + OpenCV 2.4.9 x64, скомпилированным, отладочным (я интегрировал это в LV2013 x64), но оно должно работать для любой другой VS-версии:

1) Щелкните правой кнопкой мыши ваше Решение> Свойства> Отладка исходных файлов...

2) Может быть два объекта (в зависимости от вашей директории VS-install)... C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE\vc7\atlmfc C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE\vc7\crt

С ними это будет работать для Visual Studio 2013 Express, но также должно работать и для других 2013. Если у вас есть Visual Studio 10 или 11, просто введите "Microsoft Visual Studio 11.0" или 10.0 в каждом. Вы также можете просто добавить их.

Эти записи вы можете получить из вашего OpenCV.sln в Solution > Properties > Debug Source Files (как описано выше). И как уже описано: CRT должен совпадать... и это происходит в этом месте.

Другие вопросы по тегам