Jakie jest znaczenie słowa kluczowego PUBLIC
, PRIVATE
i INTERFACE
związane z CUpewnij użytkownika target_include_directories
?
Odpowiedzi:
Te słowa kluczowe są używane do określenia, kiedy lista katalogów włączeń, które przekazujesz do celu, jest potrzebna. Do kiedy , to znaczy, czy te zawierają katalogi są potrzebne:
Kiedy CUpewnij kompiluje cel, wykorzystuje cele INCLUDE_DIRECTORIES
, COMPILE_DEFINITIONS
oraz COMPILE_OPTIONS
właściwości. Używając PRIVATE
słowa kluczowego in target_include_directories()
i podobnie, mówisz CMake, aby wypełnił te właściwości docelowe.
Gdy CMake wykryje zależność między celem A a innym celem B (na przykład podczas korzystania z target_link_libraries(A B)
polecenia), przechodnie propaguje B
wymagania użycia do A
celu. Te wymagania dotyczące użycia docelowego to katalogi include, definicje kompilacji itp., Które każdy cel, od którego zależy, B
musi spełniać. Są one określane przez INTERFACE_*
wersję właściwości wymienionych powyżej (np. INTERFACE_INCLUDE_DIRECTORIES
) I są zapełniane przy użyciu INTERFACE
słowa kluczowego podczas wywoływania target_*()
poleceń.
Słowo PUBLIC
kluczowe oznacza z grubsza PRIVATE + INTERFACE
.
Dlatego załóżmy, że tworzysz bibliotekę, A
która używa niektórych nagłówków Boost. Ty byś zrobił:
target_include_directories(A PRIVATE ${Boost_INCLUDE_DIRS})
jeśli używasz tylko tych nagłówków Boost w swoich plikach źródłowych ( .cpp
) lub prywatnych plikach nagłówkowych ( .h
).target_include_directories(A INTERFACE ${Boost_INCLUDE_DIRS})
jeśli nie używasz tych nagłówków Boost w swoich plikach źródłowych (dlatego nie potrzebujesz ich do kompilacji A
). Nie mogę wymyślić na to przykładu z prawdziwego świata.target_include_directories(A PUBLIC ${Boost_INCLUDE_DIRS})
jeśli używasz tych nagłówków Boost w swoich publicznych plikach nagłówkowych, które są zawarte ZARÓWNO w niektórych A
plikach źródłowych, a także mogą być zawarte w każdym innym kliencie twojej A
biblioteki.Dokumentacja CMake 3.0 zawiera więcej szczegółów na temat tej specyfikacji kompilacji i właściwości wymagań użycia .
INTERFACE
. target_include_directories(libname INTERFACE include PRIVATE include/libname)
. Oznacza to, że w swojej bibliotece możesz dołączać pliki bezpośrednio, ale jako użytkownik biblioteki musisz libname/
najpierw wstawić .
target_include_directories()
wykonywalny cel, jeśli chcesz ustawić włączane katalogi, w których mają być znalezione pliki nagłówkowe używane przez te pliki wykonywalne (na przykład: Boost :: Program_options, jeśli używasz go do analizowania argumentów w swojej main()
funkcji) . W PRIVATE
tym przypadku prawdopodobnie użyłbyś słowa kluczowego, ponieważ te pliki są potrzebne do skompilowania samego pliku wykonywalnego. Nie wiem jednak, czy jest pożytek z pliku wykonywalnego INTERFACE
lub PUBLIC
na nim.
Słowa kluczowe INTERFACE, PUBLIC i PRIVATE są wymagane do określenia zakresu następujących argumentów. Elementy PRIVATE i PUBLIC wypełnią właściwość INCLUDE_DIRECTORIES o wartości <target>. Elementy PUBLIC i INTERFACE wypełnią właściwość INTERFACE_INCLUDE_DIRECTORIES <target>. Poniższe argumenty określają, że zawierają katalogi.
Z dokumentacji: http://www.cmake.org/cmake/help/v3.0/command/target_include_directories.html
Aby przeformułować dokumentację własnymi słowami: