65 votes

Comment puis-je créer un projet C++ avec plusieurs interdépendants les sous-répertoires?

J'ai un projet C++ où j'ai utilisé les répertoires de plus en plus un facteur organisationnel -- la façon dont on peut utiliser les packages en Java ou des répertoires dans PHP. Les répertoires ne sont pas destinés à être auto-suffisant, mais plutôt juste une façon d'organiser l'ensemble du projet et qui me garde d'être submergé par les sources. Comment puis-je construire mon CMakeLists.txt fichiers pour traiter ce problème? Faire les répertoires des bibliothèques ne semble pas à sa place ici, car ils sont tous interdépendants et ne sont pas destinés à être utilisés de cette façon.

Comme une question connexe, la plupart des exemples que j'ai vu de plusieurs sous-répertoires dans CMake (et il ne sont pas très nombreux) ont ignoré ou écarté la question de réglage include_directories, ce qui est quelque chose que j'ai eu du mal avec. Court de peigner mes fichiers source pour déterminer le fichier dépend de qui et dans quel répertoire, est de toute façon il vient de créer tous les répertoires en vertu de l' /src/ comme potentiel de répertoires et de laisser CMake travail qui sont en fait dépendants?

Voici un exemple de structure:

--src
  --top1
    --mid1
      --bot1
        --src1.cpp
        --hdr1.h
      --bot2
        --src2.cpp
        --hdr2.h
    --mid2
      --bot3
        --src3.cpp
        --src4.cpp
        --hdr3.h
  --top2
    --mid3
      --src5.cpp
      --hdr4.h

Ainsi de suite et ainsi de suite. Comment puis-je structure mon CMakeLists.txt fichiers pour gérer ce genre de structure?

64voto

sakra Points 13373

Depuis la structure de répertoire de votre projet est juste là pour organiser vos fichiers, une approche est d'avoir un CMakeLists.txt qui retrouve automatiquement tous les fichiers sources dans l' src répertoire et ajoute également toutes les répertoires d'inclure des répertoires qui ont un fichier d'en-tête en eux. La suite de CMake fichier peut servir de point de départ:

project (Foo)

file(GLOB_RECURSE Foo_SOURCES "src/*.cpp")
file(GLOB_RECURSE Foo_HEADERS "src/*.h")

set (Foo_INCLUDE_DIRS "")
foreach (_headerFile ${Foo_HEADERS})
    get_filename_component(_dir ${_headerFile} PATH)
    list (APPEND Foo_INCLUDE_DIRS ${_dir})
endforeach()
list(REMOVE_DUPLICATES Foo_INCLUDE_DIRS)

include_directories(${Foo_INCLUDE_DIRS})
add_executable (FooExe ${Foo_SOURCES})

Les deux file(GLOB_RECURSE ... des commandes de déterminer l'ensemble de la source et les fichiers d'en-tête. L' foreach boucle calcule l'ensemble des inclure des répertoires à partir de la liste de tous les fichiers d'en-tête.

Un inconvénient avec le calcul de l'ensemble des fichiers sources est que CMake ne détecte automatiquement lorsque de nouveaux fichiers sont ajoutés à votre arborescence des sources. Manuellement, vous devez re-créer vos fichiers de compilation, puis.

3voto

Guy Sirton Points 5092

Je ne suis pas un expert sur CMake, mais depuis il n'y a pas d'autres réponses, je vais jeter un oeil à la documentaton et de lui donner un aller. L'organisation de la source et inclure des fichiers dans des répertoires différents est à peu près la norme.

Il ressemble à CMake permet de donner une liste de répertoires include: http://www.cmake.org/cmake/help/cmake-2-8-docs.html#command:include_directories

Donc quelque chose comme:

include_directories("src/top1/mid1/bot1" "src/top1/mid1/bot2/" ... )

Ceux-ci sont passés au compilateur de sorte qu'il peut trouver les fichiers d'en-tête et sera transmis pour chacun des fichiers source. Donc aucun de vos fichiers source doivent être en mesure d'inclure les fichiers d'en-tête (qui, je pense, est ce que vous demandez).

Similaire à ce que vous devriez être en mesure de faire la liste de tous vos fichiers source dans le add_executable commande:

add_executable(name "src/top1/mid1/bot1/src1.cpp" "src/top1/id1/bot2/src2.cpp" ...)

Donc, ce serait être naïf façon d'obtenir tout à construire. Chaque fichier source sera compilé et regarder pour les en-têtes dans tous les répertoires et puis l'objet fichiers seront liés ensemble. Examiner s'il existe une façon de simplifier le présent de telle sorte que vous n'avez pas besoin d'autant inclure des dossiers, peut-être il y a seulement quelques fichiers d'en-tête doivent être référencés par tous les fichiers source. Si les choses deviennent plus complexes, vous pouvez buiild sous-hiérarchies dans les bibliothèques, etc. Également envisager séparant les fichiers source et les en-têtes (par exemple, de la src et de l'inclure).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X