Saya memiliki struktur direktori untuk kode C ++ saya yang berjalan seperti ini:
|
|->include
|->src
Saya menulis file CMakeLists.txt untuk kode saya. Saya ingin memahami perbedaan antara include_directories
dan target_include_directories
dalam CMake
.
Apa perbedaan antara penggunaannya dan untuk menambahkan jalur file sertakan saya yang mana yang harus saya gunakan?
include_directories
dantarget_include_directories
? Apa yang Anda tidak mengerti tentang perbedaan di antara mereka?Jawaban:
include_directories(x/y)
mempengaruhi ruang lingkup direktori. Semua target dalam CMakeList ini, serta yang ada di semua subdirektori ditambahkan setelah titik panggilannya, akan memiliki path yangx/y
ditambahkan ke path include mereka.target_include_directories(t x/y)
memiliki cakupan target — ini menambahx/y
jalur sertakan untuk targett
.Anda menginginkan yang pertama jika semua target Anda menggunakan direktori sertakan yang dimaksud. Anda ingin yang terakhir jika jalur khusus untuk target, atau jika Anda ingin kontrol yang lebih baik dari visibilitas jalur. Yang terakhir datang dari fakta bahwa
target_include_directories()
mendukungPRIVATE
,PUBLIC
danINTERFACE
kualifikasi.sumber
x/y
di jalur sertakan target tergantung yang digunakant
dalamtarget_link_libraries
perintah mereka . Tentu saja ada tempat untuk yang pertama, tetapi saya percaya yang terakhir umumnya lebih baik.include_directories
akan terpengaruh. Saya sedang mengedit jawabannya: dokumentasi dengan jelas menyatakan bahwa semua target di CMakeLists saat ini terpengaruh. Dokumentasi tidak menyebutkan tetapi hanya subdir setelah panggilan terpengaruh (seperti yang dinyatakan dengan benar dalam jawaban asli)target_include_directories
telah diperkenalkan di CMake 2.8.11 (Mei 2013)Di samping apa jawaban Angew dengan benar, perbedaan lain yang sangat penting antara
include_directories
dantarget_include_directories
adalah bahwa, ketika digunakan denganPUBLIC
atauINTERFACE
, yang terakhir mengisiINTERFACE_INCLUDE_DIRECTORIES
properti target. Properti ini berguna ketika target lain menggunakantarget_link_libraries
untuk menautkan ke target asli, karena target yang terhubung akan secara otomatis memasukkan direktori yang ditambahkan. Lihat contoh .Fitur penting ini cukup tersembunyi di dalam dokumentasi: target_include_directories menyebutkan populating
INTERFACE_INCLUDE_DIRECTORIES
, yang dokumentasinya mengatakan:sumber
PUBLIC
properti dll. Terima kasih: DSeperti @Angew katakan, perbedaannya adalah:
1, include_directories () dapat diakses untuk semua file di source-tree 2, target_include_directories () hanya dapat diakses untuk target tertentu ketika dikompilasi.
sumber