Multiples: CRTs Visual Studio 2008 crée DLL avec dépendances manifeste à la fois VC80 et vc90 CRTs
-
30-09-2019 - |
Question
J'ai cherché à savoir pourquoi la version de débogage de notre plugins Open graphique de scène ne peuvent pas être chargés correctement (erreur Code 14001, ERROR_SXS_CANT_GEN_ACTCTX). Après googler que j'ai trouvé que le problème est que par exemple la dll de débogage freetype a un manifeste qui dépend à la fois de débogage crts vc90 et VC80.
Je ne peux pas penser à une raison pour laquelle le depenency à VC80 debug crt est là depuis que je construit la DLL à partir de zéro en utilisant Visual Studio 2008 (généré w / cmake). Et depuis 2005 VS n'est pas installé, je n'ai pas CRTs de débogage pour cela, et il est illégal de Redist, donc je dois comprendre.
Utilisation du marcheur de dépendance à l'égard dll la seule dll crt je trouve sont
- msvcr90d.dll
- msvcp90d.dll
- msvcrt.dll
Aucune référence à une vc80 CRTS ici. Alors, où cela vient?
Ceci est le manifeste pour le 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>
Informations complémentaires:
Linker ligne de commande:
/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
ligne de commande manifeste:
/nologo
/out:".\osgdb_freetype.dir\Debug\osgdb_freetyped.dll.embed.manifest"
/notify_update
La solution
Lors de la compilation de la DLL, êtes-vous un lien vers toutes les dépendances de la bibliothèque statique? Ceux-ci peuvent apporter des références à tube cathodique dans le manifeste; J'ai eu des problèmes avant lors de la liaison dans les bibliothèques Boost qui ont été compilés avec une version différente de VC.
EDIT: Les dépendances manifestes sont essentiellement émis par certains #pragma
s qui sont inclus au moment de la compilation. Même si les liens de code, ces #pragma
s vont ajouter des choses à votre manifeste. La documentation Microsoft pour les assemblages côte à côte d'origine (et comment les effets manifeste le chargeur) est .