
Di bagian sebelumnya dari kisah yang menghibur ini, kami berbicara tentang mengatur perpustakaan header sebagai bagian dari generator sistem perakitan CMake.
Kali ini kami menambahkan perpustakaan yang dikompilasi ke dalamnya, dan juga berbicara tentang tata letak modul satu sama lain.
Seperti sebelumnya, mereka yang tidak bisa menunggu, dapat segera pergi ke repositori yang diperbarui dan menyentuh semuanya dengan tangan mereka sendiri.
Isi
- Bagikan
- Taklukkan
Hal pertama yang harus dilakukan untuk mencapai tujuan mulia kami adalah membagi perangkat lunak yang sedang dikembangkan ke dalam blok universal terisolasi yang seragam dari sudut pandang pengguna.
Bagian pertama menggambarkan seperti blok standar - proyek dengan pustaka header. Sekarang mari kita tambahkan perpustakaan yang dikompilasi ke proyek kami.
Untuk melakukan ini, kami mengambil implementasi fungsi myfunc
di file .cpp
terpisah:
diff --git a/include/mylib/myfeature.hpp b/include/mylib/myfeature.hpp index 43db388..ba62b4f 100644 --- a/include/mylib/myfeature.hpp +++ b/include/mylib/myfeature.hpp @@ -46,8 +46,5 @@ namespace mylib \~ \see mystruct */ - inline bool myfunc (mystruct) - { - return true; - } + bool myfunc (mystruct); } diff --git a/src/mylib/myfeature.cpp b/src/mylib/myfeature.cpp new file mode 100644 index 0000000..abb5004 --- /dev/null +++ b/src/mylib/myfeature.cpp @@ -0,0 +1,9 @@ +#include <mylib/myfeature.hpp> + +namespace mylib +{ + bool myfunc (mystruct) + { + return true; + } +}
Kemudian kita mendefinisikan perpustakaan yang dikompilasi ( myfeature
), yang akan terdiri dari file .cpp
diperoleh pada langkah sebelumnya. Perpustakaan baru, tentu saja, membutuhkan tajuk yang ada, dan untuk memastikan ini, adalah mungkin dan perlu untuk merajutnya dengan tujuan yang ada dari mylib
. Selain itu, tautan di antara mereka bersifat publik, yang berarti bahwa segala sesuatu yang akan terhubung dengan target myfeature
secara otomatis menerima target mylib
dalam pemuatan ( lebih lanjut tentang cara-cara untuk terhubung ).
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) +
Selanjutnya, kita akan membuat pustaka baru juga diinstal pada sistem:
@@ -72,7 +83,7 @@ add_library(Mylib::mylib ALIAS mylib) install(DIRECTORY include/mylib DESTINATION include) -install(TARGETS mylib EXPORT MylibConfig) +install(TARGETS mylib myfeature EXPORT MylibConfig) install(EXPORT MylibConfig NAMESPACE Mylib:: DESTINATION share/Mylib/cmake) include(CMakePackageConfigHelpers)
Perlu dicatat bahwa untuk tujuan myfeature
, serta untuk mylib
, alias dengan awalan Mylib::
. Hal yang sama dinyatakan untuk kedua tujuan saat mengekspornya untuk instalasi dalam sistem. Ini memungkinkan untuk bekerja secara seragam dengan sasaran untuk skema penautan apa pun.
Setelah itu, tetap merajut tes unit dengan pustaka baru (fungsi myfunc
telah myfunc
dari header, jadi sekarang Anda perlu menautkan):
diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 5620be4..bc1266c 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -4,7 +4,7 @@ add_executable(mylib-unit-tests test_main.cpp) target_sources(mylib-unit-tests PRIVATE mylib/myfeature.cpp) target_link_libraries(mylib-unit-tests PRIVATE - Mylib::mylib + Mylib::myfeature doctest::doctest )
Header ( Mylib::mylib
) sekarang tidak perlu terhubung secara terpisah, karena, sebagaimana telah disebutkan, mereka secara otomatis terhubung bersama-sama dengan perpustakaan ( Mylib::myfeature
).
Dan tambahkan beberapa nuansa untuk memastikan pengukuran cakupan dengan mempertimbangkan perpustakaan yang baru tiba:
@@ -15,11 +15,16 @@ if(MYLIB_COVERAGE AND GCOVR_EXECUTABLE) target_compile_options(mylib-unit-tests PRIVATE --coverage) target_link_libraries(mylib-unit-tests PRIVATE gcov) + target_compile_options(myfeature PRIVATE --coverage) + target_link_libraries(myfeature PRIVATE gcov) + add_custom_target(coverage COMMAND ${GCOVR_EXECUTABLE} - --root=${PROJECT_SOURCE_DIR}/include/ - --object-directory=${CMAKE_CURRENT_BINARY_DIR} + --root=${PROJECT_SOURCE_DIR}/ + --filter=${PROJECT_SOURCE_DIR}/include + --filter=${PROJECT_SOURCE_DIR}/src + --object-directory=${PROJECT_BINARY_DIR} DEPENDS check )
Anda dapat menambahkan lebih banyak perpustakaan, executable, dll. Tidak masalah seberapa tepatnya mereka dirajut bersama dalam kerangka proyek. Satu-satunya hal yang penting adalah tujuan apa yang menjadi antarmuka dari modul kami, yaitu menonjol.
Sekarang kita memiliki blok-modul modul standar, dan kita dapat mendominasi mereka: membuat struktur kompleksitas apa pun darinya, menginstalnya dalam suatu sistem atau menghubungkannya dalam satu sistem perakitan tunggal.
Instalasi Sistem
Salah satu opsi untuk menggunakan modul adalah menginstal modul kami di sistem.
cmake --build /// --target install
Setelah itu, terhubung ke proyek lain menggunakan find_package
.
find_package(Mylib 1.0 REQUIRED)
Koneksi sebagai submodule
Pilihan lain adalah menghubungkan folder dengan proyek kami ke proyek lain sebagai submodule menggunakan add_subdirectory
.
Gunakan
Metode pengikatan berbeda, tetapi hasilnya sama. Dalam kedua kasus, dalam proyek menggunakan modul kami, tujuan Mylib::myfeature
dan Mylib::mylib
akan tersedia, yang dapat digunakan, misalnya, seperti ini:
add_executable(some_executable some.cpp sources.cpp) target_link_libraries(some_executable PRIVATE Mylib::myfeature)
Khususnya, dalam kasus kami, Mylib::myfeature
harus terhubung ketika perlu untuk libmyfeature
perpustakaan libmyfeature
. Jika ada cukup tajuk, maka Anda harus menggunakan Mylib::mylib
.
Target CMake bisa rumit, misalnya, dirancang hanya untuk meneruskan beberapa properti, dependensi, dll. Pada saat yang sama, bekerja dengan mereka terjadi dalam satu cara.
Apa yang harus diterima.