0

У нас есть приложение C++, которое я недавно портировал из Linux/gcc для создания на Windows с Visual Studio 2005. В приложении используется сторонняя библиотека, которая предоставляет только DLL-файлы, которые используют оптимизированную DLL-библиотеку CRT (т.е. они не предоставляют эквиваленты, которые ссылаются на DLL отладочной CRT). С VS2005 это, похоже, не проблема = сборка отладки нашла оптимизированную DLL CRT в директории System32.Debug Build App, устанавливающий Release CRT Assemblies

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

ответ

1

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

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

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

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

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

Есть несколько способов сделать это - вы можете создать манифест fragement в виде файла XML и добавить его в свои приложения «Configuration Properties> Manifest инструмент> Ввод и вывод> Дополнительная Manifest Files»

I найти наиболее удобный способ слияния дополнительных зависимых директив сборок в VS2008 - это использовать параметр командной строки компоновщика/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='????????'\"") 

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

+0

Doh, я имею в виду msvcr90.dll. Третья DLL не содержит своего собственного манифеста. Если я открою его в Dep Walker, он будет зависеть от msvcr80.dll. После некоторого дальнейшего расследования я думаю, что эта 3-я партия lib - это красная селедка. Похоже, что одна из наших библиотек связана как с отладочными, так и с оптимизированными DLL-библиотеками CRT. Похоже, что это lib, который имеет зависимость от сторонней библиотеки lib, поэтому может оказаться причиной, но я должен тщательно изучить параметры проекта. Спасибо за помощь в любом случае, я могу вернуться с большим количеством вопросов. –

+0

Мне пришлось явно исключить MSVCRT.lib в настройках проекта для конфигурации отладки, и все это, казалось, сработало.Я буду отмечать этот ответ так же правильно, как кажется, правильно ответить на мой исходный вопрос. –

+0

Если сторонние «dlls» на самом деле являются статическими lib, я должен признать, что решение не имеет большого смысла. Если они являются dll, они должны быть достаточно настойчивыми относительно той DLL, в которой они хотят. Изменение настроек компоновщика приложений не должно меняться, так как сторонние DLL-файлы уже связаны. –