2016-01-21 16 views
1

我被困在向Visual Studio C++項目添加清單的問題中。情況是我們在Release和Debug中有兩個不同的清單描述。當我們將構建系統更改爲CMake時,我需要將它們包含在配置中。適用於Visual Studio的條件清單文件

目前我有一個版本:

<?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後綴。我無法改變它。

目前我加入清單有:

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> 

回答

0

找到解決方案來處理此問題。現在我正在編譯應用程序中的條件編譯指示。現在解決了這個問題。

#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 
0

您可以通過不將它添加到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

+0

Pär,這的確如此,但是當Relesae和Debug不同時CMake無法生成Visual Studio項目。 – roalter

+0

無可否認,我沒有測試這個例子,所以可能是這樣,我以前做過類似的事情,但看起來我可能會誤解 – Paxxi

+0

另一種方法是在'add_executable()'的源列表中使用生成器表達式,即'$ <$ :app.debug.manifest>'和'$ <$ >:app.manifest>',因爲這對於所有CMake生成器類型而不是依靠計算'DEBUG'變量。 –

相關問題