我想构建我的应用程序,使得调试模式是一个控制台应用程序,而发布模式是一个Win32应用程序。根据{{3}},我需要将WIN32
添加到add_executable
,具体取决于我是否需要控制台应用程序。
因为我使用的是Visual Studio,所以我无法使用CMAKE_BUILD_TYPE
(生成的项目包含多个配置)。如何告诉CMAKE将WIN32
用于发布版本并将其省略用于调试版本?
答案 0 :(得分:7)
引用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)
更新:由于bug,此功能在最新版本中已中断。我发现一个解决方法是指定“/ SUBSYSTEM:windows”而不是“/ SUBSYSTEM:WINDOWS”。这看起来似乎有些原因。
答案 1 :(得分:4)
Dunno如果这个bug已经在CMake中修复了。我正在使用VC ++ 2010 express和CMake v2.8.10.1(目前是最新版本),我仍然遇到了完全相同的问题。
提供了一个工作解决方案here:通过添加以下内容修改源代码(例如main.cpp / main.c):
#ifndef NDEBUG
#pragma comment(linker, "/SUBSYSTEM:CONSOLE")
#endif
或者,您可以将链接器标志“/ SUBSYSTEM: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[]) { ... }