CMake: Как использовать разные ADD_EXECUTABLE для отладочной сборки? - PullRequest
4 голосов
/ 08 ноября 2011

Я бы хотел построить свое приложение таким образом, чтобы режим отладки был консольным, а режим выпуска - приложением Win32.Согласно документации мне нужно добавить WIN32 к add_executable в зависимости от того, хочу ли я консольное приложение или нет.

Поскольку я использую Visual Studio, я не могуиспользуйте CMAKE_BUILD_TYPE (сгенерированный проект содержит несколько конфигураций).Как я могу сказать CMAKE использовать WIN32 для сборок релиза и опустить его для отладочных сборок?

Ответы [ 2 ]

7 голосов
/ 08 ноября 2011

Цитирование 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)

ОБНОВЛЕНИЕ : эта функция в последних версиях не работает из-за ошибки . Я нашел один обходной путь - указать "/ SUBSYSTEM: windows" вместо "/ SUBSYSTEM: WINDOWS". Кажется, это работает по какой-то причине.

4 голосов
/ 26 ноября 2012

Не знаю, если эта ошибка была исправлена ​​в CMake.Я использую VC ++ 2010 Express и CMake v2.8.10.1 (который на данный момент является последней версией), и у меня все та же проблема.

Было предоставлено рабочее решение здесь : измените свой исходный код (например, 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[]) { ... }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...