12
votes

Comment puis-je incorporer un fichier manifeste spécifique dans une DLL Windows avec une construction CMAKE?

J'ai donc une DLL en cours de construction avec cmake nécessitant un fichier manifeste spécifique à intégrer. Dans les paramètres Visual Studio, je peux simplement ajouter le nom de fichier manifeste sous Manifest Tool / Entrée et Ouput / Fichiers manifestes supplémentaires, et cela fonctionne correctement. Il semble que c'était quelque chose qui devrait être faisable avec Clake, mais j'ai été incapable de le comprendre.

Des idées sur la façon dont je peux y accomplir avec cmake?


0 commentaires

5 Réponses :


8
votes

Il est impossible de générer le champ Fichiers Manifest supplémentaires code> dans CMake (j'ai vérifié le code source). Nous devons donc être sneakier.

visuel génère un manifeste de son propre (yourapp.exe.manifest.intermediate) et les mélanges il avec le vôtre. Nous devons donc générer ce manifeste une fois, désactivez la génération, et utiliser le produit manifeste après p>

Génération du manifeste:. Strong> p>

Cette étape est facultative si vous savez comment écrire un manifeste complet par vous-même. Si vous êtes comme le reste du monde: p>

  • Créez votre propre manifeste comme d'habitude li>
  • Ajoutez dans l'interface ( Manifest supplémentaires code>) li>
  • recompilation, Relink li>
  • Recherchez yourapp.exe.manifest (à côté de votre .exe). Copiez-le dans votre répertoire des sources et la version elle. Ne hésitez pas à le renommer, comme yourapp.final.manifest, si elle est plus clair pour vous li> Ul>

    La désactivation de la génération: strong> p>

    add_custom_command(
        TARGET YourApp
        POST_BUILD
        COMMAND "mt.exe" -manifest \"$(TargetDir)\\yourapp.final.manifest\" -outputresource:"$(TargetDir)$(TargetFileName)"\;\#1
        COMMENT "Adding manifest..." 
    )
    


0 commentaires

2
votes

Je Just em> a traversé cet exercice moi-même, c'est ce qui m'a amené à cette page. La réponse de Calvin1602 énonce à peu près la solution, mais j'ai dû finagler la syntaxe un peu pour que cela fonctionne pour moi. Voici les commandes exactes qui ont finalement fonctionné:

mt -inputresource:odrmanager.dll;#2 -out:odrmanager.manifest


0 commentaires

5
votes

Je viens de découvrir que vous pouvez fusionner plusieurs fichiers manifestes (ou manifestes intégrés à l'intérieur des exécutables) dans un fichier manifeste existant (ou exécutable) avec mt.exe. De cette façon, vous n'avez pas à désactiver la génération automatique des manifestes de Studio Visual. Vous pouvez simplement ajouter de nouvelles données manifestes avec mt.exe comme étape de postbuild. Exemple:

programme.exe a manifeste intégré: p> xxx pré>

dpiaware.manifest contient: p> xxx pré>

exécution Commande: P>

<?xml version="1.0"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
  <dependency>
    <dependentAssembly>
      <assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" processorArchitecture="amd64" publicKeyToken="6595b64144ccf1df" language="*"/>
    </dependentAssembly>
  </dependency>
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
    <security>
      <requestedPrivileges>
        <requestedExecutionLevel level="asInvoker" uiAccess="false"/>
      </requestedPrivileges>
    </security>
  </trustInfo>
  <application xmlns="urn:schemas-microsoft-com:asm.v3">
    <windowsSettings>
      <ms_windowsSettings:dpiAware xmlns:ms_windowsSettings="http://schemas.microsoft.com/SMI/2005/WindowsSettings" xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true</ms_windowsSettings:dpiAware>
    </windowsSettings>
  </application>
</assembly>


0 commentaires

0
votes

C'était très utile. Voici ce que j'ai fini par faire pour une DLL nécessitant un manifeste MSVCR90, votre kilométrage peut varier:

add_custom_command(
  TARGET foo
  POST_BUILD COMMAND
    mt.exe -manifest \"${MYDEPDIR}/msvcr90/Microsoft.VC90.CRT.manifest\" "-inputresource:\"${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_BUILD_TYPE}/foo.dll\";#2" -outputresource:\"${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_BUILD_TYPE}/foo.dll\";#2
  COMMENT
    "Appending manifest for MSVCRT90 dependency."
)


0 commentaires

17
votes

CMAKE-3.4 a maintenant appris à gérer * Les fichiers de Manifest sont répertoriés comme fichiers source.

https://cmake.org/cmake/help/ v3.4 / version / 3.4.html # Autre


0 commentaires