Điều đầu tiên chúng tôi cần làm để đạt được mục tiêu cao cả của mình là chia phần mềm chúng tôi phát triển thành các khối phổ quát, biệt lập, thống nhất theo quan điểm của người dùng.
Trong phần đầu tiên, khối tiêu chuẩn như vậy đã được mô tả - một dự án có thư viện tiêu đề. Bây giờ hãy thêm một thư viện đã biên dịch vào dự án của chúng ta.
Để làm điều này, chúng ta hãy thực hiện chức năng myfunc ở một nơi riêng biệt .cpp-tài liệu:
Sau đó, chúng tôi xác định thư viện sẽ được biên dịch (myfeature), sẽ bao gồm những gì thu được ở bước trước .cpp-tài liệu. Thư viện mới rõ ràng yêu cầu các tiêu đề hiện có và để cung cấp điều này, nó có thể và nên gắn liền với mục đích hiện có mylib. Hơn nữa, kết nối giữa chúng là công khai, có nghĩa là mọi thứ mà mục tiêu sẽ được kết nối myfeature, sẽ tự động nhận tải và mục tiêu mylib (thêm về phương pháp đan).
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)
+
Tiếp theo, chúng tôi sẽ đảm bảo rằng thư viện mới cũng được cài đặt trên hệ thống:
Cần lưu ý rằng vì mục đích myfeature, đối với mylib một bí danh có tiền tố đã được tạo Mylib::. Điều tương tự cũng được viết cho cả hai mục đích khi xuất chúng để cài đặt trên hệ thống. Điều này giúp có thể làm việc thống nhất với các mục tiêu cho bất kỳ kế hoạch ràng buộc.
Sau đó, tất cả những gì còn lại là liên kết các bài kiểm tra đơn vị với thư viện mới (hàm myfunc đã bị xóa khỏi tiêu đề nên bây giờ bạn cần dẫn link):
Bạn có thể thêm nhiều thư viện, tệp thực thi, v.v. Việc chúng được kết nối với nhau chính xác như thế nào trong dự án không quan trọng. Điều quan trọng duy nhất là mục tiêu nào là giao diện của mô-đun của chúng tôi, tức là chúng nổi bật.
Bây giờ chúng tôi có các mô-đun khối tiêu chuẩn và chúng tôi có thể thống trị chúng: kết hợp chúng thành một cấu trúc có độ phức tạp bất kỳ, cài đặt chúng vào một hệ thống hoặc liên kết chúng với nhau trong một hệ thống lắp ráp duy nhất.
Cài đặt vào hệ thống
Một trong những lựa chọn để sử dụng mô-đun là cài đặt mô-đun của chúng tôi vào hệ thống.
Sau đó, nó được kết nối với bất kỳ dự án nào khác bằng lệnh find_package.
find_package(Mylib 1.0 REQUIRED)
Kết nối dưới dạng mô-đun con
Một tùy chọn khác là kết nối thư mục với dự án của chúng tôi với dự án khác dưới dạng mô hình con bằng lệnh add_subdirectory.
Sử dụng
Các phương pháp ràng buộc là khác nhau, nhưng kết quả là như nhau. Trong cả hai trường hợp, các mục tiêu sẽ có sẵn trong dự án bằng mô-đun của chúng tôi Mylib::myfeature и Mylib::mylib, có thể được sử dụng, ví dụ như thế này:
Cụ thể trong trường hợp của chúng tôi, thư viện Mylib::myfeature cần kết nối khi cần liên kết với thư viện libmyfeature. Nếu có đủ tiêu đề thì nên sử dụng thư viện Mylib::mylib.
Ví dụ: mục tiêu CMake có thể phức tạp, chỉ nhằm mục đích chuyển tiếp một số thuộc tính, phần phụ thuộc, v.v. Đồng thời, làm việc với họ cũng diễn ra theo cách tương tự.