Как принудительно использовать компилятор С++ для использования конкретной версии CRT?
Я использую VS2008 для разработки COM-библиотеки dll, которая по умолчанию использует CRT версии 9
но я использую фреймворк TSF (Text service framework), который несовместим с новым CRT. Я думаю, что решение заключается в использовании совместимого, так как я могу указать версию CRT?
Ответы
Ответ 1
Всем сердцем присоединяюсь к рекомендации не, чтобы вручную изменить версию CRT, с которой вы ссылаетесь. Если, однако, по какой-то причине (что я не могу себе представить) это правильный курс действий для вас, способ сделать это - изменить манифест для вашего проекта.
Сначала убедитесь, что манифест не генерируется в каждой сборке (на VS2005: свойства конфигурации/файл компоновщика/манифест/генерировать манифест), так как он перезаписывает ваши ручные изменения. Также убедитесь, что эта изоляция включена.
Затем найдите файл манифеста - должен быть в $(IntDir) (например, Debug). Вы должны увидеть раздел, похожий на -
<dependency>
<dependentAssembly>
<assemblyIdentity type='win32' name='Microsoft.VC80.DebugCRT' version='8.0.50727.762' processorArchitecture='x86' publicKeyToken='1fc8b3b9a1e18e3b' />
</dependentAssembly>
</dependency>
(Для отладочных сборников, конечно). Вам нужно отредактировать атрибуты версии и publicKeyToken элемента CRT.
Вы можете просмотреть файлы в локальной папке WINDOWS\WinSxS, чтобы просмотреть доступные версии. Проверьте здесь, как извлечь publicKeyToken, как только найдете нужную версию. (Хотя я сначала попытаюсь посмотреть прямо в манифесты других проектов, привязавшись к вашей желаемой версии CRT).
Если вы поедете туда, ожидайте грубой воды. Возможно, вам повезло, если ваше приложение является консольным приложением, которое не связано с другими компонентами Side-by-Side (MFC, OpenMP и т.д.). Если ваше приложение является нетривиальным, я был бы удивлен, если не будут какие-то замысловатые зависимости от версии, а не компоненты SxS.
(edit) Вам также необходимо распространить с вашим приложением конкретный CRT, который вы используете. Здесь кто-то, который это сделал.
Ответ 2
Самый простой способ - создать вашу DLL с версией VС++, которая использует CRT, совместимый с TFS.
Я не думаю, что это хорошая идея просто связать свою DLL с другой версией CRT, если вы не используете ту же версию файлов заголовков. И самый простой способ сделать это - использовать правильную версию VС++...
Если вы все еще хотите попробовать, вы можете:
- перейдите в раздел "Настройки конфигурации- > Линетер- > Ввод- > Игнорировать определенную библиотеку" и введите crt, который вы используете (libc.lib, libcmt.lib и т.д. см. это статья проекта проекта).
- Введите имя версии crt, которую вы хотите использовать в разделе "Параметры конфигурации → Линетер- > Ввод- > Дополнительные зависимости", и ее путь в "Конфигурационные настройки- > Линетер- > Общие- > Дополнительные библиотечные каталоги".
Вы также можете попробовать изменить каталоги по умолчанию в "Инструменты- > Параметры- > Проекты и решения- > Файлы VС++- > файлы библиотек". Возможно, изменение $(VCInstallDir) lib на путь, в котором находится другая версия CRT, сделает трюк
Ответ 3
Не пытайтесь использовать VS9 и ссылаться на другую версию CRT.
Если вам нужно, чтобы ваше приложение ссылалось на другой CRT, скажем, VS8 CRT, вы должны скомпилировать и связать свое приложение в этой версии VS.
Ответ 4
Решение работало для меня с Visual Studio Express 2013 x64 + OpenCV 2.4.9 x64 скомпилировано, debug (я интегрировал это в LV2013 x64), но он должен работать для любой другой VS-версии:
1) Щелкните правой кнопкой мыши свое решение > Свойствa > Отладка исходных файлов...
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 в разделе "Решение" > "Свойства" > "Отлаживать исходные файлы" (как описано выше). И как уже было сказано: CRT должен соответствовать... и это происходит в этом месте.