Το πρώτο πράγμα που πρέπει να κάνουμε για να επιτύχουμε τον υψηλό στόχο μας είναι να χωρίσουμε το λογισμικό που αναπτύσσουμε σε καθολικά, απομονωμένα μπλοκ που είναι ομοιόμορφα από τη σκοπιά του χρήστη.
Στο πρώτο μέρος, περιγράφηκε ένα τέτοιο τυπικό μπλοκ - ένα έργο με βιβλιοθήκη κεφαλίδων. Τώρα ας προσθέσουμε μια μεταγλωττισμένη βιβλιοθήκη στο έργο μας.
Για να γίνει αυτό, ας αφαιρέσουμε την υλοποίηση της συνάρτησης myfunc σε ξεχωριστό .cpp-αρχείο:
Στη συνέχεια ορίζουμε τη βιβλιοθήκη που θα μεταγλωττιστεί (myfeature), το οποίο θα αποτελείται από αυτό που λήφθηκε στο προηγούμενο βήμα .cpp-αρχείο. Η νέα βιβλιοθήκη προφανώς απαιτεί υπάρχουσες κεφαλίδες και για να το παρέχει αυτό, μπορεί και πρέπει να συνδεθεί με τον υπάρχοντα σκοπό mylib. Επιπλέον, η μεταξύ τους σύνδεση είναι δημόσια, πράγμα που σημαίνει ότι όλα με τα οποία θα συνδεθεί ο στόχος myfeature, θα λάβει αυτόματα το φορτίο και τον στόχο mylib (περισσότερα για τις μεθόδους πλεξίματος).
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)
+
Στη συνέχεια, θα βεβαιωθούμε ότι η νέα βιβλιοθήκη είναι επίσης εγκατεστημένη στο σύστημα:
Πρέπει να σημειωθεί ότι για το σκοπό myfeature, όσον αφορά mylib δημιουργήθηκε ένα ψευδώνυμο με πρόθεμα Mylib::. Το ίδιο γράφεται και για τους δύο σκοπούς κατά την εξαγωγή τους για εγκατάσταση στο σύστημα. Αυτό καθιστά δυνατή την ομοιόμορφη εργασία με στόχους για οποιονδήποτε δεσμευτικό σύστημα.
Μετά από αυτό, το μόνο που μένει είναι να συνδέσουμε τις δοκιμές μονάδων με τη νέα βιβλιοθήκη (συνάρτηση myfunc αφαιρέθηκε από τον τίτλο, οπότε τώρα πρέπει να συνδέσετε):
Επικεφαλίδες (Mylib::mylib) τώρα δεν χρειάζεται να συνδεθείτε ξεχωριστά, γιατί, όπως αναφέρθηκε ήδη, συνδέονται αυτόματα μαζί με τη βιβλιοθήκη (Mylib::myfeature).
Και ας προσθέσουμε μερικές αποχρώσεις για να εξασφαλίσουμε μετρήσεις κάλυψης λαμβάνοντας υπόψη τη νεοαφιχθέντα βιβλιοθήκη:
Μπορείτε να προσθέσετε περισσότερες βιβλιοθήκες, εκτελέσιμα κ.λπ. Δεν έχει σημασία πόσο ακριβώς συνδέονται μεταξύ τους μέσα στο έργο. Το μόνο σημαντικό πράγμα είναι ποιοι στόχοι είναι η διεπαφή της ενότητας μας, δηλαδή προεξέχουν.
Τώρα έχουμε τυπικές μονάδες μπλοκ και μπορούμε να τις κυριαρχήσουμε: να τις συνθέσουμε σε μια δομή οποιασδήποτε πολυπλοκότητας, να τις εγκαταστήσουμε σε ένα σύστημα ή να τις συνδέσουμε μεταξύ τους μέσα σε ένα ενιαίο σύστημα συναρμολόγησης.
Εγκατάσταση στο σύστημα
Μία από τις επιλογές για τη χρήση της μονάδας είναι να εγκαταστήσουμε τη μονάδα μας στο σύστημα.
Μετά από αυτό, συνδέεται με οποιοδήποτε άλλο έργο χρησιμοποιώντας την εντολή find_package.
find_package(Mylib 1.0 REQUIRED)
Σύνδεση ως υπομονάδα
Μια άλλη επιλογή είναι να συνδέσουμε το φάκελο με το έργο μας σε ένα άλλο έργο ως υπομονάδα χρησιμοποιώντας την εντολή add_subdirectory.
Χρήση
Οι μέθοδοι δέσμευσης είναι διαφορετικές, αλλά το αποτέλεσμα είναι το ίδιο. Και στις δύο περιπτώσεις, οι στόχοι θα είναι διαθέσιμοι στο έργο χρησιμοποιώντας την ενότητα μας Mylib::myfeature и Mylib::mylib, το οποίο μπορεί να χρησιμοποιηθεί, για παράδειγμα, ως εξής:
Συγκεκριμένα στην περίπτωσή μας η βιβλιοθήκη Mylib::myfeature πρέπει να συνδεθούν όταν είναι απαραίτητο να συνδεθούν με τη βιβλιοθήκη libmyfeature. Εάν υπάρχουν αρκετές κεφαλίδες, τότε αξίζει να χρησιμοποιήσετε τη βιβλιοθήκη Mylib::mylib.
Οι στόχοι CMake μπορεί να είναι δύσκολοι, για παράδειγμα, να προορίζονται μόνο για την προώθηση ορισμένων ιδιοτήτων, εξαρτήσεων κ.λπ. Ταυτόχρονα, η εργασία μαζί τους συμβαίνει με τον ίδιο τρόπο.