J'ai actuellement un projet appelé LIBS avec une structure comme celle-ci:Cmake: Exportation des objectifs du sous-projet au projet principal
├── Lib1
│ ├── CMakeLists.txt
│ ├── lib1-class.cpp
│ └── lib1-class.h
├── lib2
│ └── CMakeLists.txt
│ ├── lib2-class.cpp
│ ├── lib2-class.h
├── cmake
│ └── LIBSConfig.cmake.in
├── CMakeLists.txt
dans le fichier principal de CMake, j'ai:
install(
TARGETS
lib1
lib2
DESTINATION
${PROJECT_DIRNAME_lib}
EXPORT
${PROJECT_NAME}Exports
)
install(
EXPORT
${PROJECT_NAME}Exports
DESTINATION
${PROJECT_DIRNAME_lib}
)
comme Je veux les exporter dans un paquet qui est détectable par find_package().
Mon problème est que je produis lib1
et lib2
dans leurs répertoires respectifs et lors de leur installation, Cmake me dit que
Error:install TARGETS given target "lib1" which does not exist in this directory.
Comme suggéré here, je crois comprendre que je devrais utiliser Export()
et lib1 et lib2 , ont quelque chose de la forme:
export(TARGETS lib1 FILE lib1Exports.cmake)
et dans le projet LIBS, quelque chose comme ceci: 012 Cependant, il n'aime pas que j'utilise le même nom pour cette bibliothèque qui est ajoutée à partir du projet parent. Par contre, cela ne me plaît pas. Il me dit:
Error:add_library cannot create imported target "lib1" because another target with the same name already exists.
si la bibliothèque est disponible et je peux lui associerez, etc. si je devais créer une autre cible dans le répertoire parent, mais je ne peux pas l'installer.
J'ai trouvé exactement le même problème dans un rapport de bug here mais je crois que cmake gère les choses différemment maintenant et je ne le fais pas correctement. Alors, est-ce que je me trompe? Je voudrais éviter d'utiliser des paquets externes si possible.
Mise à jour: la solution acceptée ne fonctionne que dans les cas où il n'y a pas de dépendance entre lib1, lib2. Dans ce cas, il faut utiliser la solution fournie à la question this.
Je voulais utiliser export() dans l'arbre de construction. C'est après avoir eu toutes les cibles de construction dans le projet principal que j'ai voulu les installer() comme un paquet unifié afin que les gens puissent trouver find_Package (LIBS). Votre méthode installe réellement ces cibles directement, donc je n'aurai pas à m'inquiéter à ce sujet. – ShS
Il y a un léger problème avec cette méthode. Si lib1 dépend de lib2, au niveau de la construction, nous pouvons nous en occuper par add_dependency (lib1 lib2) mais si nous incluons les fichiers d'export, si nous ne les incluons pas dans le bon ordre, nous ne serons pas en mesure de satisfaire le dépendance. Comment puis-je inclure les informations de dépendance de lib1 dans le fichier d'exportation? – ShS
J'ai demandé cela dans une question séparée ici: http://stackoverflow.com/questions/36103012/cmake-dependency-management-in-a-multi-library-package-export N'hésitez pas à jeter un oeil! – ShS