2011-11-08 34 views
4

我想建立我的應用程序,使調試模式是一個控制檯應用程序和發佈模式是一個Win32應用程序。根據documentation,我需要將WIN32添加到add_executable,具體取決於我是否需要控制檯應用程序。CMake:如何使用不同的ADD_EXECUTABLE進行調試構建?

因爲我使用的是Visual Studio,所以我不能使用CMAKE_BUILD_TYPE(生成的項目包含多個配置)。我如何告訴CMAKE使用WIN32進行發佈版本,並將其忽略用於調試版本?

回答

6

報價http://www.cmake.org/Wiki/VSConfigSpecificSettings

if(WIN32) 
    set_target_properties(WindowApplicationExample PROPERTIES LINK_FLAGS_DEBUG "/SUBSYSTEM:CONSOLE") 
    set_target_properties(WindowApplicationExample PROPERTIES COMPILE_DEFINITIONS_DEBUG "_CONSOLE") 
    set_target_properties(WindowApplicationExample PROPERTIES LINK_FLAGS_RELWITHDEBINFO "/SUBSYSTEM:CONSOLE") 
    set_target_properties(WindowApplicationExample PROPERTIES COMPILE_DEFINITIONS_RELWITHDEBINFO "_CONSOLE") 
    set_target_properties(WindowApplicationExample PROPERTIES LINK_FLAGS_RELEASE "/SUBSYSTEM:windows") 
    set_target_properties(WindowApplicationExample PROPERTIES LINK_FLAGS_MINSIZEREL "/SUBSYSTEM:windows") 
endif(WIN32) 

UPDATE:該功能在最新版本由於bug打破。我找到的一種解決方法是指定「/ SUBSYSTEM:windows」而不是「/ SUBSYSTEM:WINDOWS」。這似乎是有原因的。

+0

我有同樣的問題,但此解決方案不適用於VC++ 2010. – fbafelipe

+0

@fbafelipe,我在寫這個答案時使用VC++ 2010,所以除非有什麼改變(在VC++或CMake中),它應該可以工作。您是否應用底部提到的解決方法? – Gili

+1

是的,我沒有工作。我忘了提及,它是我用來打開項目的VC++ 2010 express(雖然CMake生成VC++ 2010項目,但我沒有任何區別)。我嘗試了很多東西,我嘗試將LINK_FLAGS更改爲所有配置,並且它不會更改爲WINDOWS子系統。我可以使用Windows子系統的唯一方法是ADD_EXECUTABLE(名稱爲WIN32源代碼),但這樣我無法用控制檯進行調試並使用Windows進行發佈。 – fbafelipe

4

不知道如果這個bug已經在CMake中修復了。我使用的是VC++ 2010 express和CMake v2.8.10.1(這是當前的最新版本),我仍然有完全相同的問題。通過添加修改源代碼(例如main.cpp中/ main.c中):

一個工作溶液提供here

#ifndef NDEBUG 
#pragma comment(linker, "/SUBSYSTEM:CONSOLE") 
#endif 

或者,你可以在鏈接器標記 「/子系統:WINDOWS」 添加到發佈模式構建。我使用這個定義,似乎工作:

#ifdef _MSC_VER 
# ifdef NDEBUG 
#  pragma comment(linker, "/SUBSYSTEM:WINDOWS /ENTRY:mainCRTStartup") 
# else 
#  pragma comment(linker, "/SUBSYSTEM:CONSOLE") 
# endif 
#endif 

使用入口點的設置,以避免鏈接錯誤的情況下,你已經定義:

int main(int argc, char* argv[]) { ... } 
相關問題