Несколько CRT: Visual Studio 2008 создает библиотеки DLL с явными зависимостями для CRT VC80 и VC90. - PullRequest
2 голосов
/ 10 ноября 2010

Я выяснил, почему отладочная сборка наших графов открытых сцен плагинов не может быть загружена правильно (код ошибки 14001, ERROR_SXS_CANT_GEN_ACTCTX).После долгих поисков я обнаружил, что проблема в том, что, например, отладочная библиотека freetype имеет манифест, который зависит как от CRC отладки VC90, так и от VC80.

Поскольку я создавал DLL с нуля, используя Visual Studio 2008 (сгенерированный w / cmake), я не могу думать ни о какой причине, по которой существует зависимость от VC80 для отладки crt.А так как VS 2005 не установлен, у меня нет для этого отладочных ЭЛТ, и переадресация запрещена, поэтому мне нужно это выяснить.

Использование средства обхода зависимостей на dll - единственная библиотека DLL, которую яfind являются

  • msvcr90d.dll
  • msvcp90d.dll
  • msvcrt.dll

Нет ссылок на какие-либо crc vc80 здесь.Так откуда это взялось?

Это манифест для 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 Ответ

4 голосов
/ 10 ноября 2010

При компиляции DLL вы ссылаетесь на какие-либо статические зависимости библиотеки?Они могут принести ссылки CRT в манифесте;Раньше у меня были проблемы при линковке в библиотеки boost, скомпилированные с другой версией VC.

EDIT: зависимости манифеста в основном генерируются некоторыми #pragma, которые включаются во время компиляции.Несмотря на то, что код ссылки, эти #pragma добавят вещи в ваш манифест.Документация Microsoft для собственных параллельных сборок (и как манифест влияет на загрузчик): здесь .

...