Jestem nowy w CMake i jestem trochę zdezorientowany ze słowami kluczowymi PUBLIC, PRIVATE i INTERFACE związanymi z target_link_libraries()
. Dokumentacja wspomina, że można ich użyć do określenia zarówno zależności łącza, jak i interfejsu łącza w jednym poleceniu.
Co właściwie oznaczają zależności i interfejs linków?
Odpowiedzi:
Jeśli tworzysz bibliotekę współdzieloną, a pliki źródłowe cpp # zawierają nagłówki innej biblioteki (na przykład QtNetwork), ale twoje pliki nagłówkowe nie zawierają nagłówków QtNetwork, to QtNetwork jest
PRIVATE
zależnością.Jeśli pliki źródłowe i nagłówki zawierają nagłówki innej biblioteki, jest to
PUBLIC
zależność.Jeśli pliki nagłówkowe, ale nie pliki źródłowe, zawierają nagłówki innej biblioteki, jest to
INTERFACE
zależność.Inne właściwości kompilacji
PUBLIC
iINTERFACE
zależności są propagowane do bibliotek konsumujących. http://www.cmake.org/cmake/help/v3.0/manual/cmake-buildsystem.7.html#transitive-usage-requirementsźródło
PUBLIC
czyPRIVATE
sprawy? Co to zmienia?PRIVATE
nie dodaje zależności do projektów łączących się z biblioteką. Jest czystszy, a także pozwala uniknąć potencjalnych konfliktów między zależnościami a użytkownikiem.PUBLIC
zależność, a nieINTERFACE
zależność.@steveire zaakceptowana odpowiedź jest świetna. Chciałem tylko dodać tabelę, aby szybko zobaczyć różnicę:
źródło
Niektóre odpowiedzi mówiły tylko, kiedy używać PRYWATNE / PUBLICZNE / INTERFEJSU, ale efekty są ignorowane. Zobacz: CMake-Public-Private-Interface
PUBLICZNE
Wszystkie obiekty następujące po PUBLIC będą używane do łączenia się z bieżącym celem i dostarczania interfejsu do innych celów, które są zależne od bieżącego celu.
PRYWATNE
Wszystkie obiekty następujące po PRIVATE będą używane tylko do łączenia się z bieżącym celem.
INTERFEJS
Wszystkie obiekty następujące po INTERFEJSIE będą używane tylko do dostarczania interfejsu do innych celów, które mają zależności od bieżącego celu.
źródło