CMake'de include_directories ve target_include_directories arasındaki fark nedir?


134

C ++ kodum için şu şekilde giden bir dizin yapım var:

|
|->include
|->src

Kodum için bir CMakeLists.txt dosyası yazıyorum. Ben arasındaki farkı anlamak istiyorum include_directoriesve target_include_directoriesdeCMake .

Kullanımları arasındaki fark nedir ve dahil etme dosya yolumu eklemek için hangisini kullanmalıyım?


4
Eğer belgelerine okudunuz include_directoriesve target_include_directories? Aralarındaki farkı anlamadığınız şey nedir?
Bir programcı dostum

74
Dokümantasyonda netlik yok. Okudum ve Angew'in cevabında ne yazdığını tahmin ettim ama açıklama yok, örnek yok ve proje oluşturma amaçlı bir sistem için CMake belgelerinde proje bazlı örnekler yok. CMake'nin iyi ve kapsamlı bir dokümantasyonu olsaydı, bu sorularla topluluğa yük olmazdım.
Ujjwal Aryan

Cmake kavramları yetersiz şekilde belgelenmiştir. Özellikle hedefleyin ve "hedeflenmemiş".
John Greene

Yanıtlar:


148

include_directories(x/y)dizin kapsamını etkiler. Bu CMakeList'teki tüm hedeflerin yanı sıra çağrının noktasından sonra eklenen tüm alt dizinlerdeki hedefler, içerme yollarına x/yeklenen yola sahip olacaktır .

target_include_directories(t x/y)hedef kapsamı vardır - hedef x/yiçin içerme yoluna ekler t.

Tüm hedefleriniz söz konusu dahil dizinleri kullanıyorsa, birincisini istersiniz. Yol bir hedefe özelse veya yolun görünürlüğünün daha hassas bir şekilde kontrol edilmesini istiyorsanız, ikincisini istersiniz. İkinci olmasından kaynaklanır target_include_directories()destekler PRIVATE, PUBLICve INTERFACEeleme.


35
Bence ikincisi genellikle tercih edilmelidir (cmake 3 kullanıldığı sürece). Bu katması açısından yarar vardır x/ykullanan bağımlı hedeflerin yolu dahil içinde tonların içinde target_link_librarieskomutlar. Elbette ilki için bir yer var, ancak ikincisinin genellikle daha iyi olduğuna inanıyorum.
Phil

2
Orijinal cevap, yalnızca sonradan eklenen hedeflerin ve alt dizinlerin include_directoriesetkileneceğini belirtti. Cevabı düzenliyorum: dokümantasyon , mevcut CMakeLists'teki tüm hedeflerin etkilendiğini açıkça belirtiyor . Dokümantasyondan söz edilmiyor, yalnızca aramadan sonraki alt
dizinler

@Phil, target_include_directoriesCMake 2.8.11'de (Mayıs 2013) tanıtıldı
tamas.kenez

@ tamas.kenez Bunu dikkatime çektiğiniz için teşekkürler, düzeltildi. Bunun "bundan sonra" bir şey olduğuna oldukça ikna olmuştum.
Angew artık

40

Ne yanında Angew cevabı doğru söylüyor, aralarında başka çok önemli bir fark include_directoriesve target_include_directoriesdeyişle, birlikte kullanıldığında PUBLICveya INTERFACE, ikincisi doldurmak INTERFACE_INCLUDE_DIRECTORIEShedefin özelliği. Bu özellik, başka bir hedef target_link_librariesorijinal hedefe bağlanmak için kullandığında yararlıdır , çünkü bağlanan hedef otomatik olarak bu dizinleri içerecektir. Bkz örnek .

Bu önemli özellik oldukça iyi belgelerinde gizlidir: target_include_directories doldururken söz INTERFACE_INCLUDE_DIRECTORIESkimin, dokümantasyon diyor ki:

Hedef bağımlılıklar target_link_libraries () kullanılarak belirtildiğinde , CMake, tüketicinin derleme özelliklerini belirlemek için bu özelliği tüm hedef bağımlılıklardan okuyacaktır.


Bu, PUBLICvb. Özelliklerin anlaşılır bir açıklamasını ilk kez okudum ! Teşekkürler: D
RL-S

2

@Angew'in dediği gibi, fark şu:

1, include_directories () kaynak ağacındaki tüm dosyalar için erişilebilir durumdadır 2, target_include_directories () yalnızca derleme sırasında belirli bir hedef için erişilebilir.

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.