Mam strukturę katalogów dla mojego kodu C ++, która wygląda następująco:
|
|->include
|->src
Piszę plik CMakeLists.txt dla mojego kodu. Chcę zrozumieć różnicę między include_directories
i target_include_directories
w CMake
.
Jaka jest różnica między ich użyciem i aby dodać ścieżkę do pliku dołączanego, której powinienem użyć?
include_directories
itarget_include_directories
? Czego nie rozumiesz na temat różnicy między nimi?Odpowiedzi:
include_directories(x/y)
wpływa na zakres katalogu. Wszystkie cele w tym CMakeList, a także te we wszystkich podkatalogach dodanych po punkcie jego wywołania, będą miały ścieżkęx/y
dodaną do ich ścieżki dołączania.target_include_directories(t x/y)
ma zasięg docelowy - dodajex/y
do ścieżki dołączania celut
.Chcesz tego pierwszego, jeśli wszystkie cele używają wymienionych katalogów włączania. Potrzebujesz tego drugiego, jeśli ścieżka jest specyficzna dla celu lub jeśli chcesz mieć lepszą kontrolę nad widocznością ścieżki. To ostatnie wynika z faktu, że
target_include_directories()
podpieraPRIVATE
,PUBLIC
iINTERFACE
kwalifikatorów.źródło
x/y
ścieżki dołączania dowolnych zależnych celów, które używająt
w swoichtarget_link_libraries
poleceniach. Oczywiście jest miejsce na to pierwsze, ale uważam, że to drugie jest generalnie lepsze.include_directories
wpłynie to tylko na cele i podkatalogi dodane później . Edytuję odpowiedź: dokumentacja wyraźnie stwierdza, że dotyczy to wszystkich obiektów docelowych w bieżących CMakeLists. Dokumentacja nie wspomina, ale dotyczy to tylko podkatalogów po wezwaniu (jak słusznie stwierdzono w oryginalnej odpowiedzi)target_include_directories
został wprowadzony w CMake 2.8.11 (maj 2013)Oprócz tego, co poprawnie mówi odpowiedź Angew , kolejną bardzo ważną różnicą między
include_directories
itarget_include_directories
jest to, że gdy jest używane zPUBLIC
lubINTERFACE
, to drugie wypełniaINTERFACE_INCLUDE_DIRECTORIES
właściwość celu. Ta właściwość jest przydatna, gdy inny cel używatarget_link_libraries
do łączenia się z pierwotnym celem, ponieważ cel łączenia będzie miał automatycznie dodane te zawierające katalogi. Zobacz przykład .Ta ważna funkcja jest dość dobrze ukryta w dokumentacji: target_include_directories wspomina o wypełnianiu
INTERFACE_INCLUDE_DIRECTORIES
, którego dokumentacja mówi:źródło
PUBLIC
właściwości itd.! Dzięki: DPUBLIC
lubINTERFACE
ztarget_include_directories
, właściwośćINTERFACE_INCLUDE_DIRECTORIES
jest wypełniana katalogami włączania wymaganymi do kompilacji względem nagłówków celu.PRIVATE
,PUBLIC
aINTERFACE
za pomocątarget_include_directories
Jak powiedział @Angew, różnica polega na:
1, funkcja include_directories () jest dostępna dla wszystkich plików w drzewie źródłowym. 2, target_include_directories () jest dostępna tylko dla określonego celu podczas kompilacji.
źródło