2017-09-28 11 views
1

J'ai quelques problèmes pour créer le CMakeList pour mon projet. J'ai la structure suivante:CMakeList pour le projet d'en-têtes et l'utiliser dans un autre projet

ProjectAB 
| 
|--- include 
|  |--- A.h 
|  |--- B.h 
| 
| --- CMakeList.txt 

Project1 
| 
|--- include 
|  |--- src1.h 
| 
|--- src 
|  |--- src1.cpp (#include "src1.h"; #include "A.h"; #include "B.h") 
| 
| --- CMakeList.txt 

ProjectAB est juste composé d'en-têtes, donc je l'ai lu dans les guides CMake et d'autres sources (link) et, enfin, je l'ai écrit la CMakeList suivante pour elle:

cmake_minimum_required(VERSION 3.6.1) 

project(lib_projectAB VERSION 1.0.0 LANGUAGES CXX) 

add_library(projectAB INTERFACE) 

include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include) 

target_include_directories(projectAB 
    INTERFACE 
     A.h 
     B.h 
) 

maintenant, je veux utiliser les en-têtes de la ProjectAB dans le Projet1. Je dois les installer pour des raisons indépendantes. Je ne sais pas comment les CMakeLists pour les deux projets devraient ressembler.

Je pensais que cela pour le Projet1:

cmake_minimum_required(VERSION 3.6.1) 

project(lib_project1 VERSION 1.0.0 LANGUAGES CXX) 

add_subdirectory(src) 

include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../projectAB/include) 

add_library(project1 
    STATIC 
     src1.h 
     src1.cpp 
) 

target_link_libraries(project1 
    PUBLIC 
     third_party_LIBRARIES 
     lib_projectAB 
) 

install(
    FILES 
     src1.h 
     A.h 
     B.h 
    DESTINATION 
     . 
) 

Mais ce n'est pas élégant ni travail.

Comment serait la bonne façon de faire cela?

Répondre

1

D'abord, vous marquez le mauvais répertoire que l'emplacement des fichiers comprennent:

include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../projectAB) 

Comme selon votre arborescence, ces fichiers se trouvent dans projectAB/include, pas projectAB directement. Selon l'emplacement des CMakeLists pour projectAB, vous pourriez rencontrer un problème similaire. De plus, vous n'utilisez pas les CMakeLists pour projectAB pour la construction de project1, mais vous devez spécifier les répertoires include, pas les fichiers d'en-tête réels - et l'appel simple include_directories est également inutile: en spécifiant l'interface include répertoires pour une cible, Tout ce qui dépend de cette cible ajoutera ces répertoires à son chemin d'inclusion.

Un autre problème est que votre project1 ne dépend pas réellement de projectAB - c'est pourquoi vous essayez de modifier manuellement le chemin d'inclusion.

Idéalement, vous voulez suivre deux chemins possibles:

  • Si les deux projets sont principalement développés séparément, vous pouvez utiliser la fonctionnalité de package de trouver de CMake pour project1 trouver projectAB
  • si elles sont habituellement développé ensemble (basé sur la mise en page, je suppose que c'est le cas), vous devez ajouter le projetAB cmakelists à project1 en utilisant add_subdirectory. Après cela, la cible projectAB sera disponible et vous pouvez l'ajouter en tant que dépendance à project1.

Malheureusement, bien qu'il soit possible d'utiliser add_subdirectory pour ajouter un répertoire qui n'est pas l'enfant du répertoire en cours, cela n'est pas recommandé.

donc à suivre cette approche, vous devez soit:

  • mouvement projectAB être un sous-répertoire de project1
  • ou ajouter un CMakeLists « root », qui ajoute d'abord projectAB, puis project1 en utilisant add_subdirectory - ce qui signifierait que project1 utiliserait la cible projectAB.
+0

Salut Dutow, d'abord merci pour votre temps. J'ai mis à jour la question avec l'emplacement des CMakeLists et aussi avec le droit include_directories ($ {CMAKE_CURRENT_SOURCE_DIR} /../ projectAB/include) Je pensais à ce que vous avez dit à propos de l'ajout de ProjectAB mais je ne peux pas l'ajouter comme sous répertoire Il existe d'autres projets (Project2, Project3 ...) exactement avec la même structure que Project1 qui utilisent ProjectAB. Donc faire une copie sur chacun serait un peu sale. Je considérais aussi l'option de rendre le projetAB "trouvable" par CMake mais je voulais savoir s'il y avait plus d'options. – solosito

+0

L'autre option couramment utilisée est ce que j'ai également mentionné ici: ajouter un cmakefile "top level" dans le répertoire contenant project1 et projectAB, et ajouter les deux projets en tant que sous-répertoires. – Dutow