簡體   English   中英

Visual Studio的條件清單文件

[英]Conditional Manifest File for Visual Studio

我陷入了將清單添加到Visual Studio C ++項目的問題。 情況是我們在Release和Debug中有兩個不同的清單描述。 當我們將構建系統更改為CMake時,我需要特定地包括它們。

目前我已經發布:

<?xml version='1.0' encoding='UTF-8' standalone='yes'?>
<assembly xmlns='urn:schemas-microsoft-com:asm.v1' manifestVersion='1.0'>
   <dependency>
      <dependentAssembly>
         <assemblyIdentity type='win32' name='DeliveredComponent' version='1.0.0.0' processorArchitecture='amd64' />
     </dependentAssembly>
  </dependency>
</assembly>

對於調試:

<?xml version='1.0' encoding='UTF-8' standalone='yes'?>
<assembly xmlns='urn:schemas-microsoft-com:asm.v1' manifestVersion='1.0'>
   <dependency>
      <dependentAssembly>
         <assemblyIdentity type='win32' name='DeliveredComponent.Debug' version='1.0.0.0' processorArchitecture='amd64' />
     </dependentAssembly>
  </dependency>
</assembly>

只是不要問為什么Debug組件使用.Debug后綴。 我不能改變

目前,我在清單中添加:

add_custom_command(
    TARGET MyExeFile
    POST_BUILD
    COMMAND "mt.exe" -manifest \"${CMAKE_CURRENT_SOURCE_DIR}\\MyExeFile.$(Configuration).x64.manifest\" -outputresource:\"$<TARGET_FILE:${targetname}>\;1\" 
    COMMENT "Adding manifest..."
)

CMake 3.4開始不推薦使用此方法,此外,此生成后步驟還會更改輸出文件,這意味着以后要重新鏈接可執行文件 (Visual Studio依賴項檢查)。

這就是為什么我現在想將* .manifest添加到add_executable命令(自3.4開始支持)的原因。 但是如何切換清單?

是否有可能(使用生成器表達式或類似表達式)選擇要在項目中編譯的兩個文件之一? (僅DEBUG或RELEASE)。 還是可以在清單中的兩個路徑之間進行內部切換? 就像是

<dependentAssembly configuration='Debug'>
   ...
</dependentAssembly>

您可以通過不將其添加到add_executable調用中來解決此問題,但以后再添加,就像這樣。

add_executable(myexe source1.cpp source2.cpp)
if (DEBUG)
  target_sources(myexe PRIVATE app.manifest.debug)
else ()
  target_sources(myexe PRIVATE app.manifest)

這里的PRIVATE表示添加的源是為此可執行文件提供的,並且不會導出到可能依賴於此的任何庫。 可以在cmake.org v3.6 docs的文檔中找到更多信息。

找到了解決方案。 目前,我正在將條件實用程序編譯到應用程序中。 現在解決了這個問題。

#pragma once

#ifdef _DEBUG
# if defined _M_IX86
#  pragma comment(linker,"/manifestdependency:\"type='win32' name='MyLibrary.Debug' processorArchitecture='x86' version='1.0.0.0'\"")
# elif defined _M_IA64
#  pragma comment(linker,"/manifestdependency:\"type='win32' name='MyLibrary.Debug' processorArchitecture='ia64' version='1.0.0.0'\"")
# elif defined _M_X64
#  pragma comment(linker,"/manifestdependency:\"type='win32' name='MyLibrary.Debug' processorArchitecture='amd64' version='1.0.0.0'\"")
# else
#  pragma comment(linker,"/manifestdependency:\"type='win32' name='MyLibrary.Debug' processorArchitecture='*' version='1.0.0.0'\"")
# endif
#else
# if defined _M_IX86
#  pragma comment(linker,"/manifestdependency:\"type='win32' name='MyLibrary' processorArchitecture='x86' version='1.0.0.0'\"")
# elif defined _M_IA64
#  pragma comment(linker,"/manifestdependency:\"type='win32' name='MyLibrary' processorArchitecture='ia64' version='1.0.0.0'\"")
# elif defined _M_X64
#  pragma comment(linker,"/manifestdependency:\"type='win32' name='MyLibrary' processorArchitecture='amd64' version='1.0.0.0'\"")
# else
#  pragma comment(linker,"/manifestdependency:\"type='win32' name='MyLibrary' processorArchitecture='*' version='1.0.0.0'\"")
# endif
#endif

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM