Anahtar kelimenin anlamı nedir PUBLIC, PRIVATEve INTERFACECKağıt en ilişkili target_include_directories?
Yanıtlar:
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:
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 .
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/.
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 .
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: