Как заставить C ++ компилятор использовать конкретную версию CRT? - PullRequest
11 голосов
/ 08 апреля 2009

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

Ответы [ 4 ]

10 голосов
/ 12 апреля 2009

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

Сначала убедитесь, что манифест не генерируется при каждой сборке (на VS2005: свойства конфигурации / компоновщик / файл манифеста / генерация манифеста), поскольку он перезапишет изменения, внесенные вами вручную. Также убедитесь, что изоляция включена. Затем найдите файл манифеста - он должен быть в $ (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, который вы используете. Вот кто-то , кто это сделал.

2 голосов
/ 08 апреля 2009

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

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

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

  • перейдите в «Настройки конфигурации-> Linker-> Input-> Ignore specific library» и введите используемый вами crt (libc.lib, libcmt.lib и т. Д., См. Эту статью проекта кода для подробности).
  • Введите имя версии CRT, которую вы хотите использовать, в «Параметры конфигурации-> Линкер-> Ввод-> Дополнительные зависимости» и его путь в «Конфигурационные параметры-> Линкер-> Общие-> Дополнительные каталоги библиотек».

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

0 голосов
/ 10 октября 2014

Решение сработало у меня с 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 должен совпадать ... и это происходит в этом месте.

0 голосов
/ 08 апреля 2009

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

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

...