Apa arti dari kata kunci PUBLIC
, PRIVATE
dan INTERFACE
terkait dengan CMake ini target_include_directories
?
Jawaban:
Kata kunci ini digunakan untuk mengetahui kapan daftar direktori penyertaan yang Anda berikan ke target diperlukan. Pada saat , itu berarti jika itu termasuk direktori yang dibutuhkan:
Ketika CMake sedang menyusun target, menggunakan target INCLUDE_DIRECTORIES
, COMPILE_DEFINITIONS
dan COMPILE_OPTIONS
properti. Saat Anda menggunakan PRIVATE
kata kunci in target_include_directories()
dan sejenisnya, Anda memberi tahu CMake untuk mengisi properti target tersebut.
Saat CMake mendeteksi ketergantungan antara target A dan target B lainnya (seperti saat Anda menggunakan target_link_libraries(A B)
perintah), CMake menyebarkan B
persyaratan penggunaan ke A
target secara transitif . Mereka persyaratan penggunaan sasaran adalah termasuk direktori, definisi kompilasi, dll bahwa setiap target itu tergantung pada B
keharusan bertemu. Mereka ditentukan oleh INTERFACE_*
versi properti yang tercantum di atas (seperti INTERFACE_INCLUDE_DIRECTORIES
), dan diisi dengan menggunakan INTERFACE
kata kunci saat memanggil target_*()
perintah.
Kata PUBLIC
kunci artinya kira-kira PRIVATE + INTERFACE
.
Oleh karena itu, misalkan Anda membuat pustaka A
yang menggunakan beberapa header Boost. Anda akan melakukan:
target_include_directories(A PRIVATE ${Boost_INCLUDE_DIRS})
jika Anda hanya menggunakan header Boost tersebut di dalam file sumber ( .cpp
) atau file header pribadi ( .h
).target_include_directories(A INTERFACE ${Boost_INCLUDE_DIRS})
jika Anda tidak menggunakan header Boost di dalam file sumber Anda (oleh karena itu, tidak memerlukannya untuk dikompilasi A
). Saya tidak bisa benar-benar memikirkan contoh dunia nyata untuk ini.target_include_directories(A PUBLIC ${Boost_INCLUDE_DIRS})
jika Anda menggunakan header Boost tersebut di file header publik Anda, yang disertakan KEDUA dalam beberapa A
file sumber dan mungkin juga disertakan dalam klien lain di A
perpustakaan Anda .Dokumentasi CMake 3.0 memiliki detail selengkapnya tentang spesifikasi build ini dan properti persyaratan penggunaan .
INTERFACE
. target_include_directories(libname INTERFACE include PRIVATE include/libname)
. Ini berarti bahwa di dalam perpustakaan Anda, Anda dapat menyertakan file secara langsung, tetapi sebagai pengguna perpustakaan Anda harus menyisipkan libname/
terlebih dahulu.
target_include_directories()
target yang dapat dieksekusi jika Anda perlu menyetel direktori include di mana file header yang digunakan oleh executable tersebut dapat ditemukan (misalnya: Boost :: Program_options, jika Anda menggunakannya untuk mengurai argumen dalam main()
fungsi Anda ) . Anda mungkin akan menggunakan PRIVATE
kata kunci dalam kasus ini, karena file-file ini diperlukan untuk mengkompilasi file yang dapat dieksekusi itu sendiri. Saya tidak tahu apakah ada gunanya INTERFACE
atau PUBLIC
pada sebuah executable.
Kata kunci INTERFACE, PUBLIC dan PRIVATE diperlukan untuk menentukan cakupan dari argumen berikut. Item PRIVATE dan PUBLIC akan mengisi properti INCLUDE_DIRECTORIES dari <target>. Item PUBLIC dan INTERFACE akan mengisi properti INTERFACE_INCLUDE_DIRECTORIES dari <target>. Argumen berikut menentukan direktori include.
Dari dokumentasi: http://www.cmake.org/cmake/help/v3.0/command/target_include_directories.html
Untuk menyusun ulang dokumentasi dengan kata-kata saya sendiri: