web-dev-qa-db-fra.com

CMake avec les chemins d'inclusion et de source - configuration de base

J'essaie de mettre en place un projet de test ressemblant à mon propre projet juste pour que les choses fonctionnent en premier et il ressemble à ceci:

/MainProject/inc/main.h
/MainProject/src/main.cpp
/LibProject/inc/test.h
/LibProject/src/test.cpp

J'ai trouvé des tutoriels, mais je ne peux pas savoir comment configurer cela lorsque j'ai le dossier inc et src? À quoi ressembleraient les fichiers CMakeLists.txt? Aurais-je un dans /, un dans chacun des dossiers de projet? Il semble que je n'ai pas besoin d'en avoir un dans les dossiers inc et src?

40
bitgregor

Tu as besoin d'un CMakeLists.txt pour chaque sous-répertoire source. Votre structure devrait ressembler à ceci:

root
|-MainProject
| |-inc
| | '-main.h
| |-src
| | |-main.cpp
| | '-CMakeLists.txt
| '-CMakeLists.txt 
|-LibProject
| |-inc
| | '-test.h
| |-src
| | |-test.cpp
| | '-CMakeLists.txt
| '-CMakeLists.txt
'-CMakeLists.txt

Contenu de root/CMakeLists.txt:

project(MyProject)
add_subdirectory(MainProject)
add_subdirectory(LibProject)

Contenu de LibProject/CMakeLists.txt et MainProject/CMakeLists.txt:

add_subdirectory(src)

Contenu de LibProject/src/CMakeLists.txt:

# Notice name prefix of this variable, set by CMake according
# to value given with "project()" in the root CMakeLists.txt.
include_directories(${MyProject_SOURCE_DIR}/LibProject/inc)
add_library(LibProject test.cpp)

Contenu de MainProject/src/CMakeLists.txt:

include_directories(${MyProject_SOURCE_DIR}/MainProject/inc)
# I assume you want to use LibProject as a library in MainProject.
include_directories(${MyProject_SOURCE_DIR}/LibProject/inc)
link_directories(${MyProject_SOURCE_DIR}/LibProject/src)
add_executable(MainProject main.cpp)
target_link_libraries(MainProject LibProject)

Ensuite, configurez et construisez avec:

$ cd root
$ mkdir build
$ cd build
$ cmake ..
$ make
78

Vous pourriez le faire comme suivre.

  • CMakeLists.txt dans votre répertoire MainProject:

    project(MainProject)
    
    add_subdirectory(LibProject/src)
    add_subdirectory(MainProject/src)
    
  • CMakeLists.txt dans votre répertoire LibProject/src:

    include_directories(${PROJECT_SOURCE_DIR}/LibProject/inc/)
    add_library(LibProject test.cpp)
    
  • CMakeLists.txt dans votre répertoire MainProject/src:

    include_directories(${PROJECT_SOURCE_DIR}/MainProject/inc/)
    add_executable(MainProject main.cpp)
    target_link_libraries(MainProject LibProject)
    
20
Beginner

Dans mon cas, je voulais le faire avec un CMakeList unique . Et ça a marché pour moi. J'ajoute ma solution au cas où elle servirait à n'importe qui.

Voici ce que j'ai fait dans mon cas:

My structure:
Project
|CMakeLists.txt
|-src
| |*.cpp
| |*.c
|-include
| |*.hpp
| |*.h

Mes CMakeLists.txt se composent de parties principales:

include_directories(
        ${PROJECT_SOURCE_DIR}/include
        ${PROJECT_SOURCE_DIR}/src
)

^ Permet aux fichiers .cpp d'ajouter des en-têtes dans le dossier include.

file(GLOB all_SRCS
        "${PROJECT_SOURCE_DIR}/include/*.h"
        "${PROJECT_SOURCE_DIR}/include/*.hpp"
        "${PROJECT_SOURCE_DIR}/src/*.cpp"
        "${PROJECT_SOURCE_DIR}/src/*.c"
        )

^ Ajoutez simplement ce qui se trouve dans ces dossiers.

PS: si vous voulez voir l'intégralité de CMakeLists.txt, allez sur le lien du projet NEGU93/ForbiddenDesert .

6
Agustin Barrachina