Отладка сборочного приложения, находящего сборки Release CRT - PullRequest
0 голосов
/ 20 августа 2009

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

Я сейчас пытаюсь собрать и запустить наше приложение с VS2008, и отладочная сборка не запускается, потому что не может найти оптимизированную библиотеку CRT DLL (msvc690.dll). Библиотеки CRT VC9 скрыты в каталогах с именем стиля GUID - я считаю, что это параллельная сборка, и приложение должно находить ее с помощью манифеста приложения. Однако манифест, который создается и внедряется в исполняемый файл приложения, указывает только отладочную 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 DLL в сборку? Если да, то как мне это сделать?

1 Ответ

1 голос
/ 20 августа 2009

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

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

Тот факт, что он работал с VS2005, а не с VS2008, подразумевает, что dll хочет использовать версии режима исполнения 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. если вы можете их найти и заполнить, все должно получиться.

...