Anahtar kelimenin anlamı nedir PUBLIC
, PRIVATE
ve INTERFACE
CKağı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_DEFINITIONS
ve COMPILE_OPTIONS
özelliklerini. Eğer kullandığınız zaman PRIVATE
anahtar 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 A
hedefe yayar . Bu hedef kullanım gereksinimleri , bağlı olan herhangi bir hedefin B
karşı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ı.
PUBLIC
Anahtar kelime kabaca demektir PRIVATE + INTERFACE
.
Bu nedenle, A
bazı 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 A
kaynak dosyalarında bulunur ve A
kitaplığı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 ) . PRIVATE
Yü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 INTERFACE
veya 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: