我想建立我的應用程序,使調試模式是一個控制檯應用程序和發佈模式是一個Win32應用程序。根據documentation,我需要將WIN32
添加到add_executable
,具體取決於我是否需要控制檯應用程序。CMake:如何使用不同的ADD_EXECUTABLE進行調試構建?
因爲我使用的是Visual Studio,所以我不能使用CMAKE_BUILD_TYPE
(生成的項目包含多個配置)。我如何告訴CMAKE使用WIN32
進行發佈版本,並將其忽略用於調試版本?
我想建立我的應用程序,使調試模式是一個控制檯應用程序和發佈模式是一個Win32應用程序。根據documentation,我需要將WIN32
添加到add_executable
,具體取決於我是否需要控制檯應用程序。CMake:如何使用不同的ADD_EXECUTABLE進行調試構建?
因爲我使用的是Visual Studio,所以我不能使用CMAKE_BUILD_TYPE
(生成的項目包含多個配置)。我如何告訴CMAKE使用WIN32
進行發佈版本,並將其忽略用於調試版本?
報價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」。這似乎是有原因的。
不知道如果這個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[]) { ... }
我有同樣的問題,但此解決方案不適用於VC++ 2010. – fbafelipe
@fbafelipe,我在寫這個答案時使用VC++ 2010,所以除非有什麼改變(在VC++或CMake中),它應該可以工作。您是否應用底部提到的解決方法? – Gili
是的,我沒有工作。我忘了提及,它是我用來打開項目的VC++ 2010 express(雖然CMake生成VC++ 2010項目,但我沒有任何區別)。我嘗試了很多東西,我嘗試將LINK_FLAGS更改爲所有配置,並且它不會更改爲WINDOWS子系統。我可以使用Windows子系統的唯一方法是ADD_EXECUTABLE(名稱爲WIN32源代碼),但這樣我無法用控制檯進行調試並使用Windows進行發佈。 – fbafelipe