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

Gil*_*ili 4 cmake visual-studio

我想构建我的应用程序,使调试模式是一个控制台应用程序,发布模式是一个Win32应用程序.根据我需要添加的文档WIN32,add_executable取决于我是否需要控制台应用程序.

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

Gil*_*ili 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)
Run Code Online (Sandbox Code Playgroud)

更新:由于错误,此功能在最新版本中被破坏.我发现一个解决方法是指定"/ SUBSYSTEM:windows"而不是"/ SUBSYSTEM:WINDOWS".这看起来似乎有些原因.


Sig*_*rtz 5

不知道这个错误是否已经在 CMake 中修复了。我正在使用 VC++ 2010 express 和 CMake v2.8.10.1(目前是最新版本),但我仍然遇到完全相同的问题。

这里提供一个可行的解决方案:通过添加以下内容修改您的源代码(例如 main.cpp/main.c):

#ifndef NDEBUG
#pragma comment(linker, "/SUBSYSTEM:CONSOLE")
#endif
Run Code Online (Sandbox Code Playgroud)

或者,您可以将链接器标志“/SUBSYSTEM:WINDOWS”添加到发布模式构建中。我正在使用这个似乎有效的定义:

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

如果您已定义,请使用入口点设置以避免链接器错误:

int main(int argc, char* argv[]) { ... }
Run Code Online (Sandbox Code Playgroud)