CMake target_include_directories kapsamın anlamı


Yanıtlar:


124

Bu anahtar kelimeler , hedefe ilettiğiniz içerme dizinleri listesine ne zaman ihtiyaç duyulduğunu söylemek için kullanılır . By zaman , o dizinleri ihtiyaç vardır eklerseniz anlama gelir:

  • Bu hedefin kendisini derlemek için.
  • Bu hedefe bağlı diğer hedefleri derlemek için (genel başlıklarını kullanmak gibi).
  • Yukarıdaki her iki durumda da.

CKağıt bir hedef derleme zaman, hedefleri kullanır INCLUDE_DIRECTORIES, COMPILE_DEFINITIONSve COMPILE_OPTIONSözelliklerini. Eğer kullandığınız zaman PRIVATEanahtar kelime target_include_directories()ve benzeri, o hedef özelliklerini doldurmak için CMake söyle.

CMake, bir hedef A ile başka bir hedef B arasında bir bağımlılık algıladığında ( target_link_libraries(A B)komutu kullandığınızda olduğu gibi ), B kullanım gereksinimlerini geçişli olarak Ahedefe yayar . Bu hedef kullanım gereksinimleri , bağlı olan herhangi bir hedefin Bkarşılaması gereken içerme dizinleri, derleme tanımları vb . Onlar tarafından belirtilen INTERFACE_*(gibi yukarıda sıralanan özelliklerin sürümü INTERFACE_INCLUDE_DIRECTORIES) ve kullanarak doldurulur INTERFACEçağrılırken anahtar kelime target_*()komutları.

PUBLICAnahtar kelime kabaca demektir PRIVATE + INTERFACE.

Bu nedenle, Abazı Boost başlıklarını kullanan bir kitaplık oluşturduğunuzu varsayalım . Yapacaksın:

  • target_include_directories(A PRIVATE ${Boost_INCLUDE_DIRS})Bu Boost başlıklarını yalnızca kaynak dosyalarınızda ( .cpp) veya özel başlık dosyalarınızda ( .h) kullanırsanız.
  • target_include_directories(A INTERFACE ${Boost_INCLUDE_DIRS})bu Boost başlıklarını kaynak dosyalarınızın içinde kullanmazsanız (bu nedenle, derlemek için onlara gerek yoktur A). Bunun için gerçek dünyadan bir örnek düşünemiyorum.
  • target_include_directories(A PUBLIC ${Boost_INCLUDE_DIRS})Bu Boost başlıklarını genel başlık dosyalarınızda kullanırsanız, bunlar HERHANGİ BİRİ'nin Akaynak dosyalarında bulunur ve Akitaplığınızın başka herhangi bir istemcisine de dahil edilebilir .

CMake 3.0 belgeleri, bu derleme belirtimi ve kullanım gereksinimleri özellikleri hakkında daha fazla ayrıntı içerir .


18
Gerçek dünya örneğiyle ilgili olarak INTERFACE. target_include_directories(libname INTERFACE include PRIVATE include/libname). Bu, kitaplığınızın içine dosyaları doğrudan dahil edebileceğiniz, ancak kitaplığın bir kullanıcısı olarak önce eklemeniz gerektiği anlamına gelir libname/.
KaareZ

2
Bu cevaplar kütüphane oluşturmak için bana mantıklı geliyor. Ancak yürütülebilir bir hedef için target_include_directories'i çağırmaya ne dersiniz?
Norman Pellet

1
@NormanPellet: Bu target_include_directories()çalıştırılabilir dosyalar tarafından kullanılan başlık dosyalarının bulunacağı dizinleri dahil etmeniz gerekiyorsa çalıştırılabilir bir hedef çağırabilirsiniz (örneğin: Boost :: Program_options, main()işlevinizde argümanları ayrıştırmak için kullanırsanız ) . PRIVATEYürütülebilir dosyanın kendisini derlemek için bu dosyalara ihtiyaç duyulduğundan, muhtemelen bu durumda anahtar sözcüğü kullanırsınız . Yine de bir yürütülebilir dosya için INTERFACEveya PUBLICüzerinde bir kullanım olup olmadığını bilmiyorum .
TManhente

13

INTERFACE, PUBLIC ve PRIVATE anahtar sözcükleri, aşağıdaki bağımsız değişkenlerin kapsamını belirtmek için gereklidir. PRIVATE ve PUBLIC öğeleri, <target> INCLUDE_DIRECTORIES özelliğini doldurur. PUBLIC ve INTERFACE öğeleri, <target> INTERFACE_INCLUDE_DIRECTORIES özelliğini doldurur. Aşağıdaki bağımsız değişkenler dizinleri içerir.

Belgelerden: http://www.cmake.org/cmake/help/v3.0/command/target_include_directories.html

Belgeleri kendi sözlerimle yeniden ifade etmek için:

  • bir hedef için içerme dizini listesine bir dizin eklemek istiyorsanız
  • PRIVATE ile dizin, hedefin dahil etme dizinlerine eklenir
  • INTERFACE ile hedef değiştirilmez, ancak INTERFACE_INCLUDE_DIRECTORIES dizin tarafından genişletilir. Değişken, bir kitaplık için genel içerme dizinlerinin bir listesidir.
  • PUBLIC ile hem PRIVATE hem de INTERFACE'ten eylemler gerçekleştirilir.

5
CMAKE belgelerini inceledim, ancak hala ne anlama geldiklerini ve hangi bağlamda olduklarını (dosya oluşturma veya nasıl derlediklerini) anlamadım?
Sirish

@Sirish: Belgeleri yeniden ifade etmeye çalıştım, umarım yardımcı olur.
usr1234567
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.