Несколько CRT: Visual Studio 2008 создает библиотеки DLL с явными зависимостями для CRT VC80 и VC90.
Я выяснил, почему отладочная сборка наших плагинов с открытым графом сцены не может быть загружена правильно (код ошибки 14001, ERROR_SXS_CANT_GEN_ACTCTX). После долгих поисков я обнаружил, что проблема в том, что, например, отладочная библиотека freetype имеет манифест, который зависит как от CRC отладки VC90, так и от VC80.
Так как я построил DLL с нуля, используя Visual Studio 2008 (сгенерированный w/ cmake), я не могу думать ни о какой причине, по которой существует зависимость от отладки crt VC80. А поскольку VS 2005 не установлен, у меня нет для этого отладочных ЭЛТ, и его нелегально перераспределять, поэтому мне нужно это выяснить.
Используя обходчик зависимостей на dll, единственные crt dll, которые я нахожу,
- msvcr90d.dll
- msvcp90d.dll
- msvcrt.dll
Нет ссылки на какие-либо VC80 CRT здесь. Так откуда это?
Это манифест для DLL.
<?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>
<dependency>
<dependentAssembly>
<assemblyIdentity type='win32' name='Microsoft.VC80.DebugCRT' version='8.0.50727.762' processorArchitecture='x86' publicKeyToken='1fc8b3b9a1e18e3b' />
</dependentAssembly>
</dependency>
</assembly>
Дополнительная информация:
Командная строка компоновщика:
/OUT:"osgdb_freetyped.dll"
/VERSION:0.0
/INCREMENTAL
/NOLOGO
/DLL
/MANIFEST
/MANIFESTFILE:"osgdb_freetype.dir\Debug\osgdb_freetyped.dll.intermediate.manifest"
/MANIFESTUAC:"level='asInvoker' uiAccess='false'"
/DEBUG
/PDB:"osgdb_freetyped.pdb"
/DYNAMICBASE
/NXCOMPAT
/IMPLIB:"osgdb_freetyped.lib"
/ERRORREPORT:PROMPT
/STACK:10000000
/machine:I386
/debug
kernel32.lib user32.lib gdi32.lib winspool.lib
shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib
advapi32.lib OpenThreadsd.lib osgd.lib osgDBd.lib osgUtild.lib
osgTextd.lib freetype235_D.lib glu32.lib opengl32.lib
osgDBd.lib osgd.lib OpenThreadsd.lib glu32.lib opengl32.lib
Манифест командной строки:
/nologo
/out:".\osgdb_freetype.dir\Debug\osgdb_freetyped.dll.embed.manifest"
/notify_update
1 ответ
При компиляции DLL вы ссылаетесь на какие-либо статические зависимости библиотеки? Они могут вносить ссылки CRT в манифест; Раньше у меня были проблемы при подключении к библиотекам boost, которые были скомпилированы с другой версией VC.
РЕДАКТИРОВАТЬ: манифест зависимости в основном излучаются некоторыми #pragma
s, которые включены во время компиляции. Хотя код ссылки, те #pragma
s добавит материал в ваш манифест. Документация Microsoft для собственных параллельных сборок (и как манифест влияет на загрузчик) находится здесь.