Buatlah ketergantungan antarmuka target_link_libraries

100

Saya baru mengenal CMake dan agak bingung dengan kata kunci PUBLIK, PRIVATE, dan INTERFACE yang terkait target_link_libraries(). Dokumentasi menyebutkan bahwa mereka dapat digunakan untuk menentukan dependensi tautan dan antarmuka tautan dalam satu perintah.

Apa sebenarnya arti dependensi tautan dan antarmuka tautan?

Sirish
sumber
1
Pertanyaan serupa: stackoverflow.com/questions/26243169/…
TManhente

Jawaban:

203

Jika Anda membuat pustaka bersama dan file cpp sumber Anda #include header pustaka lain (Katakanlah, QtNetwork misalnya), tetapi file header Anda tidak menyertakan header QtNetwork, maka QtNetwork adalah PRIVATEketergantungan.

Jika file sumber dan header Anda menyertakan header pustaka lain, maka itu adalah PUBLICketergantungan.

Jika file header Anda tetapi tidak file sumber Anda menyertakan header pustaka lain, maka itu adalah INTERFACEketergantungan.

Properti build PUBLICdan INTERFACEdependensi lainnya disebarkan untuk menggunakan library. http://www.cmake.org/cmake/help/v3.0/manual/cmake-buildsystem.7.html#transitive-usage-requirements

steveire
sumber
41
Inilah penjelasan paling jelas dari pertanyaan ini yang pernah saya dengar. Saya berharap dokumentasi cmake sejelas! :-)
Ela782
1
Terima kasih atas penjelasannya Saya mengerti artinya sekarang tetapi mengapa menentukan PUBLICatau PRIVATEpenting? Apa yang berubah?
pengguna3667089
9
Menggunakan PRIVATEtidak menambahkan dependensi Anda ke proyek yang menautkan ke perpustakaan Anda. Ini lebih bersih dan juga menghindari kemungkinan konflik antara dependensi Anda dan pengguna Anda.
pengguna2658323
7
@steveire Demi kejelasan, mungkin ada baiknya menyatakan secara eksplisit bahwa "menyertakan" berarti inklusi transitif, bukan hanya inklusi langsung. Misalnya jika file header dari perpustakaan lain hanya secara langsung disertakan oleh file header Anda, tetapi semua file header Anda disertakan oleh file sumber Anda, maka file sumber Anda secara transitif menyertakan file header perpustakaan lain, sehingga Anda memiliki PUBLICketergantungan, bukan sebuah INTERFACEketergantungan.
Ose
Dokumentasi cmake harus menulisnya sesingkat jawaban ini!
Bryan Jyh Herng Chong
0

@steveire menerima jawaban yang bagus. Saya hanya ingin menambahkan tabel untuk melihat perbedaannya dengan cepat:

.-----------.------------------.----------------.
|           | Linked by target | Link interface |
:-----------+------------------+----------------:
| PUBLIC    |        X         |        X       |
:-----------+------------------+----------------:
| PRIVATE   |        X         |                |
:-----------+------------------+----------------:
| INTERFACE |                  |        X       |
'-----------'------------------'----------------'
  • Ditautkan oleh target : pustaka disertakan dalam sumber target (bukan ketergantungan untuk proyek yang menghubungkan pustaka).
  • Antarmuka tautan: perpustakaan termasuk dalam tajuk publik target (ketergantungan untuk proyek yang menghubungkan perpustakaan).
ikaro
sumber