CMake:如何使用不同的ADD_EXECUTABLE进行调试构建?

时间:2011-11-08 17:39:35

标签: visual-studio cmake

我想构建我的应用程序,使得调试模式是一个控制台应用程序,而发布模式是一个Win32应用程序。根据{{​​3}},我需要将WIN32添加到add_executable,具体取决于我是否需要控制台应用程序。

因为我使用的是Visual Studio,所以我无法使用CMAKE_BUILD_TYPE(生成的项目包含多个配置)。如何告诉CMAKE将WIN32用于发布版本并将其省略用于调试版本?

2 个答案:

答案 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[]) { ... }