Dans la partie précédente Cette histoire amusante parlait de l'organisation d'une bibliothèque d'en-têtes au sein du générateur du système de build CMake.
Cette fois, nous y ajouterons une bibliothèque compilée et parlerons également de la liaison des modules entre eux.
Comme auparavant, ceux qui sont impatients peuvent immédiatement allez au référentiel mis à jour et touchez tout de vos propres mains.
La première chose que nous devons faire pour atteindre notre noble objectif est de diviser les logiciels que nous développons en blocs universels, isolés et uniformes du point de vue de l'utilisateur.
Dans la première partie, un tel bloc standard a été décrit - un projet avec une bibliothèque d'en-tête. Ajoutons maintenant une bibliothèque compilée à notre projet.
Pour ce faire, retirons l'implémentation de la fonction myfunc dans un endroit séparé .cpp-déposer:
Ensuite on définit la bibliothèque à compiler (myfeature), qui sera constitué de ce qui a été obtenu à l’étape précédente .cpp-déposer. La nouvelle bibliothèque nécessite évidemment des en-têtes existants, et pour fournir cela, elle peut et doit être liée à l'objectif existant. mylib. De plus, la connexion entre eux est publique, ce qui signifie que tout ce à quoi la cible sera connectée myfeature, recevra automatiquement la charge et la cible mylib (en savoir plus sur les méthodes de tricot).
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 108045c..0de77b8 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -64,6 +64,17 @@ target_compile_features(mylib INTERFACE cxx_std_17)
add_library(Mylib::mylib ALIAS mylib)
+###################################################################################################
+##
+## Компилируемая библиотека
+##
+###################################################################################################
+
+add_library(myfeature src/mylib/myfeature.cpp)
+target_link_libraries(myfeature PUBLIC mylib)
+
+add_library(Mylib::myfeature ALIAS myfeature)
+
Ensuite, nous veillerons à ce que la nouvelle bibliothèque soit également installée sur le système :
Il convient de noter qu'aux fins myfeature, pour ce qui est de mylib un alias avec un préfixe a été créé Mylib::. La même chose est écrite dans les deux cas lors de leur exportation pour installation sur le système. Cela permet de travailler de manière uniforme avec des objectifs pour tout schéma contraignant.
Après cela, il ne reste plus qu'à lier les tests unitaires avec la nouvelle bibliothèque (fonction myfunc retiré du titre, vous devez donc maintenant créer un lien) :
Rubriques (Mylib::mylib) désormais, vous n'avez plus besoin de vous connecter séparément, car, comme déjà mentionné, ils sont automatiquement connectés avec la bibliothèque (Mylib::myfeature).
Et ajoutons quelques nuances pour garantir des mesures de couverture prenant en compte la bibliothèque nouvellement arrivée :
Vous pouvez ajouter plus de bibliothèques, d'exécutables, etc. Peu importe la manière exacte dont ils sont connectés les uns aux autres au sein du projet. La seule chose importante est de savoir quelles cibles constituent l'interface de notre module, c'est-à-dire qu'elles ressortent.
Nous disposons désormais de modules de blocs standards et nous pouvons les dominer : les composer en une structure de toute complexité, les installer dans un système ou les relier entre eux au sein d'un système d'assemblage unique.
Installation dans le système
L'une des options d'utilisation du module consiste à installer notre module dans le système.
Après cela, il est connecté à tout autre projet à l'aide de la commande find_package.
find_package(Mylib 1.0 REQUIRED)
Connexion en tant que sous-module
Une autre option consiste à connecter le dossier contenant notre projet à un autre projet en tant que sous-module à l'aide de la commande add_subdirectory.
l'utilisation de
Les méthodes de liaison sont différentes, mais le résultat est le même. Dans les deux cas, les objectifs seront disponibles dans le projet grâce à notre module Mylib::myfeature и Mylib::mylib, qui peut être utilisé par exemple comme ceci :
Plus précisément dans notre cas, la bibliothèque Mylib::myfeature doivent être connectés lorsqu'il est nécessaire d'établir un lien avec la bibliothèque libmyfeature. S'il y a suffisamment d'en-têtes, cela vaut la peine d'utiliser la bibliothèque Mylib::mylib.
Les cibles CMake peuvent être délicates, par exemple, destinées uniquement à transmettre certaines propriétés, dépendances, etc. Dans le même temps, travailler avec eux se déroule de la même manière.