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

StackOverflow https://stackoverflow.com/questions/730134

Вопрос

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

Это было полезно?

Решение

Я от всей души присоединяюсь к этой рекомендации не чтобы вручную изменить версию 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, который вы используете.Вот кто - то кто это сделал.

Другие советы

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

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

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

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

Вы также можете попробовать изменить каталоги по умолчанию в разделе "Инструменты-> Параметры-> Проекты и решения-> Каталоги VC ++-> файлы библиотеки".Возможно, изменение библиотеки $ (VCInstallDir) на путь, по которому находится ваша другая версия 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 Файлы (x86)\Microsoft Visual Studio 12.0\Common7\IDE\vc7\atlmfc C:\Program Файлы (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 в разделе Решение > Свойства > Исходные файлы отладки (как описано выше).И как уже описывалось:ЭЛТ должен соответствовать...и это происходит в том месте.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top