2009-02-12 7 views
12

J'utilise pour gérer mes versions multiplateformes, et j'ai tout mis au point à l'exception de ce problème. J'ai mis RUNTIME_OUTPUT_DIRECTORY dans un répertoire bin/ où j'ai des fichiers de données stockés. Sous Linux, cela fonctionne bien. Sous Windows, les exécutables sont placés dans le sous-répertoire Debug/Release en fonction du type de construction. Est-il possible d'obtenir pour copier l'exécutable dans le répertoire approprié, ou (encore mieux) arrêter complètement d'utiliser ces sous-répertoires?cmake RUNTIME_OUTPUT_DIRECTORY sur Windows

+0

Je suppose que vous utilisez cmake pour générer une solution Visual Studio/fichiers de projet, est-ce pas? Quelle version de Visual Studio est utilisée? Quelle version de cmake? –

+0

Oui, j'utilise CMake pour générer les fichiers de solution (cmake 2.6, VS 2005) – thekidder

Répondre

9

J'ai utilisé le hack de propriété de préfixe fin signalé par Ogapo depuis des années. Ça marche. Mais à partir de la version 2.8 de CMake, il existe un support officiel pour éviter les sous-répertoires Release/Debug sous Windows.

Utilisez la CMAKE_<ARTIFACT>_OUTPUT_DIRECTORY_<CONFIGURATION> globales variables, ou les propriétés par cible <ARTIFACT>_OUTPUT_DIRECTORY_<CONFIGURATION>, comme ceci:

SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG "${OUTPUT_DIRECTORY}") 
SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE "${OUTPUT_DIRECTORY}") 
SET(CMAKE_LIBRARY_OUTPUT_DIRECTORY_DEBUG "${OUTPUT_DIRECTORY}") 
SET(CMAKE_LIBRARY_OUTPUT_DIRECTORY_RELEASE "${OUTPUT_DIRECTORY}") 
SET(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_DEBUG "${OUTPUT_DIRECTORY}") 
SET(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_RELEASE "${OUTPUT_DIRECTORY}") 
+0

Je n'ai pas cherché de solution. Et est tombé sur cette réponse et en même temps j'ai trouvé ce lien: https://cmake.org/Bug/view.php?id=9163. Cette réponse utilise exactement la même technique. Je pense que cette réponse est la meilleure solution jusqu'à présent. Fonctionne plutôt bien pour moi. Merci. –

-4

Vous devez modifier l'emplacement de construction de vos projets de studio visuel. Allez dans Propriétés du projet et dans l'onglet Compiler, spécifiez le 'Chemin de sortie de génération' où vous voulez.

Remarque

Je ne sais pas comment cela est pertinent car je ne sais pas CMake.

Vous pouvez utiliser le jeton suivant dans Visual Studio construire des événements:

$(TargetPath)

Ce sera le chemin de l'emplacement que votre projet est construit pour si en fonction de paramètres de votre projet ce sera soit la Déboguer ou relâcher le dossier.

1

Certaines variables cmake ont des versions spécifiques à la construction.

CMAKE_C_FLAGS 
    the compiler flags for compiling C sources. Note you can also specify switches with ADD_DEFINITIONS(). 
CMAKE_C_FLAGS_DEBUG 
    compiler flags for compiling a debug build from C sources. 
CMAKE_C_FLAGS_RELEASE 
    compiler flags for compiling a release build from C sources. 
CMAKE_C_FLAGS_RELWITHDEBINFO 
    compiler flags for compiling a release build with debug flags from C sources. 

Je n'ai pas vérifié ces vars existent, mais peut-être mise en RUNTIME_OUTPUT_DIRECTORY_DEBUG & & RUNTIME_OUTPUT_DIRECTORY_RELEASE à la même chose pourrait fonctionner.

10

Je ne sais pas si ces répertoires sont intentionnels ou un bug, mais au risque d'incompatibilité avant vous pouvez ajouter:

if (MSVC_IDE) 
    # hack to get around the "Debug" and "Release" directories cmake tries to add on Windows 
    set_target_properties (${NAME} PROPERTIES PREFIX "../") 
endif() 

cela a travaillé pour moi

+2

Cela fonctionne bien pour moi aussi. Pour les fichiers .lib, utilisez SET_TARGET_PROPERTIES ($ {PROJECT_NAME} PROPRIETES IMPORT_PREFIX "../") – Torleif

1

Jusqu'à présent, le meilleur La réponse que j'ai trouvée est d'écrire simplement CMake install commands pour chacune de mes cibles et fichiers de données, et de configurer le débogueur MSVC pour qu'il sorte du répertoire d'installation. Cela a l'avantage supplémentaire d'utiliser CPack pour créer des programmes d'installation.

1

Pour moi une approche globale:

set(CMAKE_STATIC_LIBRARY_PREFIX "../lib") 
set(CMAKE_SHARED_LIBRARY_PREFIX "../lib") 

fait le travail, donc je n'ai pas de définir pour chaque bibliothèque (CMake 2.8.4)