[英]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.