Ajout de plusieurs exécutables dans CMake

Mon code dans un projet c++ est organisé comme suit

  • j'ai plusieurs fichiers .cpp et .h qui contiennent mes classes
  • j'ai plusieurs fichiers .cxx qui doivent être compilés avec les fichiers .cpp et certaines bibliothèques externes.

Maintenant, chacun des fichiers .cxx a une méthode main(), donc j'ai besoin d'ajouter un exécutable différent pour chacun de ces fichiers ayant le même nom que le fichier.

En outre, ces fichiers .cxx peuvent ne pas être liés au même bibliothèques externes.

Je veux écrire cette construction dans CMake, dans laquelle je suis un peu un débutant, Comment puis-je m'y prendre?

54
demandé sur ssb 2013-01-13 22:20:25

1 réponses

Ma suggestion est d'aborder cela en deux phases:

  1. construisez une bibliothèque à partir des fichiers .cpp et .h, en utilisant add_library
  2. Itérer sur tous vos .cxx fichiers et créer un exécutable à partir de chacun, en utilisant add_executable et foreach

Construire la bibliothèque

Cela pourrait être quelque chose d'aussi simple que

file( GLOB LIB_SOURCES lib/*.cpp )
file( GLOB LIB_HEADERS lib/*.h )
add_library( YourLib ${LIB_SOURCES} ${LIB_HEADERS} )

Construire tous les exécutables

Boucle simplement sur tous les .fichiers cpp et créer des fichiers séparés les fichiers exécutables.

# If necessary, use the RELATIVE flag, otherwise each source file may be listed 
# with full pathname. RELATIVE may makes it easier to extract an executable name
# automatically.
# file( GLOB APP_SOURCES RELATIVE app/*.cxx )
file( GLOB APP_SOURCES app/*.cxx )
foreach( testsourcefile ${APP_SOURCES} )
    # I used a simple string replace, to cut off .cpp.
    string( REPLACE ".cpp" "" testname ${testsourcefile} )
    add_executable( ${testname} ${testsourcefile} )
    # Make sure YourLib is linked to each app
    target_link_libraries( ${testname} YourLib )
endforeach( testsourcefile ${APP_SOURCES} )

Quelques avertissements:

  • file( GLOB ) n'est généralement pas recommandé, car CMake ne reconstruira pas automatiquement si un nouveau fichier est ajouté. Je l'ai utilisé ici, parce que je ne connais pas vos sourcefiles.
  • dans certaines situations, les fichiers source peuvent être trouvés avec un chemin d'accès complet. Si nécessaire, utilisez l'indicateur relatif pour find( GLOB ... ).
  • La définition manuelle des fichiers source nécessite une modification de CMakeLists.txt, qui déclenche une reconstruction. Voir ceci question pour les (dés)avantages de l'expansion.
  • j'ai généré le nom de test en utilisant un string( REPLACE ... ). J'aurais pu utiliser get_filename_component avec NAME_WE drapeau.

En ce qui concerne les informations CMake "générales", Je vous conseille de lire quelques-unes des grandes questions "cmake Overview" déjà posées ici sur stackoverflow. Par exemple:

82
répondu André 2017-05-23 11:47:05