2011-11-08 7 views
4

Je voudrais construire mon application de sorte que le mode de débogage est une application de la console et le mode de libération est une application Win32. Selon le documentation je dois ajouter WIN32 à add_executable selon si je veux une application de console ou non.CMake: Comment utiliser ADD_EXECUTABLE différent pour la version de débogage?

Parce que j'utilise Visual Studio, je ne peux pas utiliser CMAKE_BUILD_TYPE (le projet généré contient plusieurs configurations). Comment puis-je dire à CMAKE d'utiliser WIN32 pour les versions de version et de l'omettre pour les versions de débogage?

Répondre

6

Citant 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) 

MISE À JOUR: Cette fonction est cassé dans les versions récentes en raison d'un bug. Une solution de contournement que j'ai trouvé est de spécifier "/ SUBSYSTEM: windows" au lieu de "/ SUBSYSTEM: WINDOWS". Cela semble fonctionner pour une raison quelconque.

+0

J'ai le même problème, mais cette solution ne fonctionne pas avec VC++ 2010. – fbafelipe

+0

@fbafelipe, j'utilisais VC++ 2010 quand j'ai écrit cette réponse, donc à moins que quelque chose ne change (dans VC++ ou CMake) ça devrait marcher. Avez-vous appliqué la solution de contournement mentionnée en bas? – Gili

+1

Oui, j'ai fait, stil ne fonctionne pas. J'ai oublié de le mentionner, c'est VC++ 2010 express que j'utilise pour ouvrir le projet (bien que CMake génère le projet VC++ 2010, et je ne pense pas que cela fasse une différence). J'ai essayé beaucoup de choses, j'ai essayé de changer LINK_FLAGS à toutes les configurations, et cela ne change pas au sous-système de WINDOWS. La seule façon dont j'arrivais à utiliser le sous-système Windows était ADD_EXECUTABLE (nom des sources WIN32), mais de cette façon je ne peux pas faire de débogage avec la console et sortir avec windows. – fbafelipe

4

Ne sais pas si ce bug a été corrigé dans CMake pour le moment. J'utilise VC++ 2010 express et CMake v2.8.10.1 (qui est actuellement la dernière version) et j'ai toujours le même problème.

Une solution de travail a été fourni here: modifier votre code source (par exemple main.cpp/main.c) en ajoutant:

#ifndef NDEBUG 
#pragma comment(linker, "/SUBSYSTEM:CONSOLE") 
#endif 

Sinon, vous pouvez ajouter le drapeau de liaison "/ SUBSYSTEM: WINDOWS" à la version en mode release. J'utilise cette définition qui semble fonctionner:

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

Utilisez le réglage point d'entrée afin d'éviter les erreurs de liens dans le cas où vous avez défini:

int main(int argc, char* argv[]) { ... } 
Questions connexes