Pengoptimalan CMake untuk Perpustakaan Statis

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.


:


  • staticA
  • staticB
  • staticC

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.

Source: https://habr.com/ru/post/undefined/


All Articles