2011-06-13 5 views
9

तो मेरे पास एक डीएलएल है जिसे सीएमके के साथ बनाया जा रहा है जिसके लिए एक विशिष्ट मैनिफेस्ट फ़ाइल को एम्बेड करने की आवश्यकता है। विजुअल स्टूडियो सेटिंग्स में मैं मैनिफेस्ट टूल/इनपुट और ओपूट/अतिरिक्त मैनिफेस्ट फाइलों के तहत मेनिफेस्ट फ़ाइल नाम जोड़ सकता हूं, और यह सही तरीके से काम करता है। ऐसा लगता है कि ऐसा कुछ ऐसा है जो सीएमके के साथ काम करने योग्य होना चाहिए, लेकिन मैं इसे समझने में असमर्थ हूं।मैं एक सीएमके निर्माण के साथ एक विंडोज डीएलएल में एक विशिष्ट मैनिफेस्ट फ़ाइल कैसे एम्बेड कर सकता हूं?

कोई विचार है कि मैं इसे सीएमके के साथ कैसे पूरा कर सकता हूं?

उत्तर

7

सीएमके में Additional Manifest Files फ़ील्ड उत्पन्न करना संभव नहीं है (मैंने स्रोत कोड की जांच की है)। तो हमें चुस्त होना होगा।

विज़ुअल अपने (yourapp.exe.manifest.intermediate) का एक अभिव्यक्ति उत्पन्न करता है और इसे आपके साथ मिश्रित करता है। इसलिए हमें एक बार इस मैनिफेस्ट को उत्पन्न करना होगा, पीढ़ी को अक्षम करना होगा, और बाद में जेनरेट किए गए मैनिफेस्ट का उपयोग करना होगा।

प्रकट जनरेट कर रहा है:

यह कदम यदि आप जानते हैं अपने आप से पूरी तरह से प्रकट लिखने के लिए कैसे वैकल्पिक है। आप दुनिया के बाकी हिस्सों की तरह कर रहे हैं:

  • के रूप में हमेशा की तरह
  • अपने स्वयं के प्रकट बनाएं यह इंटरफ़ेस में जोड़ें (Additional Manifest Files)
  • पुनः संकलित करें, फिर से लिंक
  • yourapp.exe.manifest का पता लगाएँ (आपके .exe के बगल में)। इसे अपनी स्रोत निर्देशिका में कॉपी करें और इसे संस्करण दें।

    IF(WIN32) 
        SET (CMAKE_SHARED_LINKER_FLAGS /MANIFEST:NO) 
    ENDIF(WIN32) 
    

    बाद में उत्पन्न प्रकट का उपयोग करना::

    यह नाम बदलने के लिए, yourapp.final.manifest की तरह, अगर यह स्पष्ट है आप

पीढ़ी को अक्षम करने के लिए संकोच न करें

यह पोस्ट-बिल्ड चरण में mt.exe (मैनिफेस्ट टूल जिसे सामान्यतः लिंकर के बाद बुलाया जाता है ... जब तक यह अक्षम नहीं होता) मैन्युअल कॉल द्वारा किया जाता है:

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

(आपको अपने सीएमके को लिखने के तरीके के आधार पर आपको $ (TargetDir) $ (OutDir) में बदलने की आवश्यकता होगी; अपने मूल्य देखने के लिए विजुअल के Macros बटन का उपयोग करें। और याद रखें: निष्पादन योग्य के लिए # 1, डीएल के लिए # 2)

2

I बस इस अभ्यास के माध्यम से स्वयं चला गया, जो मुझे इस पृष्ठ पर लाया। कैल्विन 1602 का जवाब काफी समाधान प्रदान करता है, लेकिन मुझे इसे मेरे लिए काम करने के लिए सिंटैक्स को थोड़ा सा करना था। यहाँ सटीक आदेशों आखिरकार काम कर रहे हैं:

if (WIN32) 
    set(CMAKE_SHARED_LINKER_FLAGS /MANIFEST:NO) 
endif() 

add_custom_command(TARGET 
        odrmanager 
        POST_BUILD 
        COMMAND 
        "mt.exe" -manifest \"${CMAKE_CURRENT_SOURCE_DIR}\\odrmanager.dll.manifest\" -outputresource:\"${CMAKE_CURRENT_BINARY_DIR}\\odrmanager\\odrmanager.dll\"\;\#2 
        COMMENT 
        "Adding custom manifest containing MSVCRT80 dependency..." 
       ) 

ध्यान दें कि आप mt.exe आदेश में #1 का उपयोग करना चाहिए जब लक्ष्य एक आवेदन है, और #2 जब यह एक DLL (कम से कम, जहाँ तक मैं समझता हूँ है- रूप में - जब तक मैंने 1 को 2 में बदल दिया, तब तक मेरे लिए काम नहीं किया)।

इसके अलावा, यदि आप चाहें तो डीएलएल से मूल मैनिफेस्ट निकालने के लिए mt.exe का उपयोग कर सकते हैं।आदेश इस तरह दिखता है:

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

यह उत्पादन हाथ से संपादित यदि आप निर्भरता आप में मर्ज करना चाहते हैं के लिए एक मैनिफ़ेस्ट फ़ाइल के लिए भी मुश्किल नहीं है लेकिन मैं दृश्य स्टूडियो होने के Calvin1602 की चाल की तरह sorta करते हैं। आपके लिए यदि आप nmake की बजाय विजुअल स्टूडियो समाधान फ़ाइलों का उपयोग कर रहे हैं।

3

मुझे अभी पता चला है कि आप कई मेनिफेस्ट फ़ाइलों (या निष्पादन योग्य के अंदर एम्बेडेड मैनिफ़ेस्ट) को mt.exe के साथ एक मौजूदा मैनिफेस्ट फ़ाइल (या निष्पादन योग्य) में विलय कर सकते हैं। इस तरह, आपको दृश्य स्टूडियो की स्वचालित मेनिफेस्ट पीढ़ी को अक्षम करने की आवश्यकता नहीं है। आप पोस्टबिल्ड चरण के रूप में mt.exe के साथ नया मेनिफेस्ट डेटा जोड़ सकते हैं। उदाहरण:

program.exe एम्बेडेड है प्रकट:

<?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> 
</assembly> 

dpiaware.manifest शामिल हैं:

<?xml version="1.0"?> 
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> 
    <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> 

भागो आदेश:

mt.exe -manifest dpiaware.manifest "-inputresource:program.exe;#1" -outputresource:program.exe;#1 

अब program.exe एम्बेडेड शामिल प्रकट:

<?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

यह बहुत उपयोगी था। यहाँ क्या मुझे DLL कि एक MSVCR90 प्रकट की जरूरत के लिए कर रही है समाप्त हो गया है, अपने लाभ भिन्न हो सकते हैं:

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." 
) 
संबंधित मुद्दे

 संबंधित मुद्दे