Приложение Debug Build, обнаруживающее сборки релиза CRT

У нас есть приложение на C ++, которое я недавно портировал из Linux / gcc для сборки в Windows с Visual Studio 2005. Приложение использует стороннюю библиотеку, которая предоставляет только библиотеки DLL, которые используют оптимизированную DLL CRT (т.е. они не предоставляют эквивалентов, которые ссылаются на DLL отладки CRT). С VS2005 это не казалось проблемой = отладочная сборка нашла оптимизированную CRT DLL в каталоге System32.

Теперь я пытаюсь собрать и запустить наше приложение с VS2008, но отладочная сборка не запускается, потому что не может найти оптимизированную DLL CRT (msvc690.dll). Библиотеки DLL VC9 CRT находятся в каталогах с именем стиля GUID - я считаю, что это параллельная сборка, и приложение должно найти ее с помощью манифеста приложения. Однако манифест, который создается и внедряется в приложение exe, указывает только отладочную сборку CRT:

<?xml version='1.0' encoding='UTF-8' standalone='yes'?>
<assembly xmlns='urn:schemas-microsoft-com:asm.v1' manifestVersion='1.0'>
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
    <security>
      <requestedPrivileges>
        <requestedExecutionLevel level='asInvoker' uiAccess='false' />
      </requestedPrivileges>
    </security>
  </trustInfo>
  <dependency>
    <dependentAssembly>
      <assemblyIdentity type='win32' name='Microsoft.VC90.DebugCRT' version='9.0.21022.8' processorArchitecture='x86' publicKeyToken='1fc8b3b9a1e18e3b' />
    </dependentAssembly>
  </dependency>
</assembly>

Я не специалист по Windows (по крайней мере, уже сейчас), так что для меня это все в новинку. Какое здесь правильное решение? Нужно ли указывать компилятору манифеста добавить оптимизированную библиотеку CRT в сборку? Если да, то как мне это сделать?


person jon-hanson    schedule 20.08.2009    source источник


Ответы (1)


В порядке. Если вы откроете стороннюю библиотеку dll в VS 2008 (убедитесь, что она выбрала OpenWith> Resource Editor), будет ли она содержать собственный манифест?

Если это так или даже нет, также полезно получить DependencyWalker, чтобы узнать, какие именно библиотеки времени выполнения эта сторонняя библиотека пытается установить ссылку на.

Тот факт, что он работал с VS2005, а не с VS2008, подразумевает, что dll хочет использовать версии Releasemode среды выполнения VS2005: msvcr80.dll

Вы упомянули файл msvc690.dll, который мне не понравился: Visual Studio 6 использовала просто названный файл msvcrt.dll - первой версией Visual Studio, в которой использовалась среда выполнения с версией dll, была VS 2003 .NET или что-то в этом роде: msvcrt7.dll

В любом случае, ЕСЛИ сторонняя библиотека не содержит собственного ресурса манифеста, то проще всего было бы добавить ссылки на зависимые сборки в манифест вашего приложения.

Есть несколько способов сделать это - вы можете создать фрагмент манифеста в виде файла XML и добавить его в свои приложения "Свойства конфигурации> Инструмент манифеста> Ввод и вывод> Дополнительные файлы манифеста"

Я считаю, что наиболее удобный способ объединения дополнительных зависимых директив сборки в VS2008 - использовать параметр командной строки linkers / manifestdependency.

Если вы добавите следующий фрагмент кода в файл в своем проекте, он даст компоновщику необходимую подсказку:

#define X_CRT_ASSEMBLY_VERSION "9.0.21022.8"
#pragma comment(linker,"/manifestdependency:\"type='win32' "\
    "name='"Microsoft.VC80.CRT' "
    "version='8.0.??.??' "                         \
    "processorArchitecture='x86' "                                 \
    "publicKeyToken='????????'\"")

Знаки ?? существуют потому, что я не знаю номеров версий или токена открытого ключа библиотек VS2005. если вы можете найти их и заполнить, все должно пройти гладко.

person Chris Becke    schedule 20.08.2009
comment
Дох, я имел в виду msvcr90.dll. Сторонняя DLL не содержит собственного манифеста. Если я открою его в Dep Walker, он будет зависеть от msvcr80.dll. После некоторого дальнейшего расследования я думаю, что эта сторонняя библиотека - отвлекающий маневр. Похоже, что одна из наших библиотек связана как с отладочными, так и с оптимизированными библиотеками CRT. Это библиотека, которая зависит от сторонней библиотеки, так что это может оказаться причиной, но мне придется тщательно изучить настройки проекта, чтобы быть уверенным. В любом случае спасибо за помощь, возможно, я вернусь с другими вопросами. - person jon-hanson; 20.08.2009
comment
Мне пришлось полностью исключить MSVCRT.lib в настройках проекта для конфигурации отладки, тогда все вроде работало. Я отмечу этот ответ как правильный, поскольку он, похоже, правильно отвечает на мой исходный вопрос. - person jon-hanson; 20.08.2009
comment
Я должен признать, что если сторонние dll не являются статическими библиотеками, это решение не имеет особого смысла. Если это библиотеки DLL, они должны быть очень настойчивы в выборе DLL среды выполнения. Изменение настроек компоновщика приложений не должно повлиять на это, поскольку сторонние библиотеки DLL уже связаны. - person Chris Becke; 20.08.2009