Mungkin tidak ada dari kita yang suka menunggu lama untuk penyelesaian perakitan proyek, ketika setiap detik seperti keabadian. Dan bagus jika ini jam kerja, dan Anda dapat menghabiskan waktu dengan segelas kopi, membahas semua kekurangan pengumpulan sampah otomatis.
Terkadang, keberhasilan tertentu dapat dicapai dengan melakukan optimasi CMake. Teknik yang dipertimbangkan di sini didasarkan pada ide sederhana: dua perpustakaan statis yang menggunakan fungsi masing-masing dapat dirakit secara bersamaan.
Sedikit anatomi
Untuk memulai, pertimbangkan langkah-langkah dasar membangun perpustakaan statis:
- preprocessor - menghapus semua komentar dari file sumber, memasukkan file header dan mengganti makro dengan nilai yang dihitung.
- compiler - mengonversi file yang diproses oleh preprocessor menjadi kode assembler.
- assembler - menerjemahkan kode rakitan menjadi kode mesin; Hasilnya disimpan sebagai file objek.
- archiver - mengumpulkan file objek ke dalam satu arsip.
Secara grafis, langkah-langkah ini ditunjukkan dalam diagram:
, . , . . , , .
, , CMake target_link_libraries. :
target_link_libraries(staticC PRIVATE staticB)
, — staticC
staticB
. , , , staticC
, staticB
.
, CoherentDeps, :
, staticC
staticB
, .
, , , ( , ) INTERFACE
, -meta ( , ). , -, .
target_link_libraries
.
, :
: NonCoherentDeps.
:
NonCoherentDeps
.
staticB
staticA
, staticC
staticB
, NonCoherentDeps
staticC
. :
CMake- staticA
- :
add_library(staticA-meta INTERFACE)
target_include_directories(staticA-meta INTERFACE "${CMAKE_CURRENT_SOURCE_DIR}")
, :
target_link_libraries(staticA PUBLIC staticA-meta)
staticB
CMake
target_link_libraries(staticB PRIVATE staticA)
:
target_link_libraries(staticB PRIVATE staticA-meta)
staticA
staticB
, . staticB
staticA
.
:
— :
add_executable(NonCoherentDeps main.cpp)
target_link_libraries(NonCoherentDeps PRIVATE staticC staticB staticA )
, .
, staticA
, target_include_directories. NonCoherentDeps, :
target_include_directories(staticB PRIVATE "${path_to_headers_in_staticA}")
:
target_link_libraries(staticB PRIVATE staticA-meta)
, staticB
staticA
, staticC
:
target_include_directories(staticC PRIVATE "${path_to_headers_in_staticB}" "${path_to_headers_in_staticA}")
. :
target_link_libraries(staticB-meta INTERFACE staticA-meta)
staticC
:
target_link_libraries(staticC INTERFACE staticB-meta)
staticB
, , .
Juga dalam paket meta Anda dapat menambahkan ketergantungan dalam bentuk perintah untuk menghasilkan file header, dan properti adalah jalur yang benar.