CMake target_link_libraries Zależności interfejsu

108

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?

Sirish
źródło
1
Podobne pytanie: stackoverflow.com/questions/26243169/ ...
TManhente

Odpowiedzi:

211

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 PRIVATEzależnością.

Jeśli pliki źródłowe i nagłówki zawierają nagłówki innej biblioteki, jest to PUBLICzależność.

Jeśli pliki nagłówkowe, ale nie pliki źródłowe, zawierają nagłówki innej biblioteki, jest to INTERFACEzależność.

Inne właściwości kompilacji PUBLICi INTERFACEzależności są propagowane do bibliotek konsumujących. http://www.cmake.org/cmake/help/v3.0/manual/cmake-buildsystem.7.html#transitive-usage-requirements

Steveire
źródło
43
To najbardziej jasne wyjaśnienie tego pytania, jakie kiedykolwiek słyszałem. Chciałbym, żeby dokumentacja cmake była tak przejrzysta! :-)
Ela782
1
Dzięki za wyjaśnienie mi zrozumieć sens teraz, ale dlaczego określenie PUBLICczy PRIVATEsprawy? Co to zmienia?
user3667089
9
Użycie PRIVATEnie 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.
user2658323
7
@steveire Ze względu na przejrzystość warto wyraźnie stwierdzić, że „uwzględnienie” oznacza włączenie przechodnie, a nie tylko włączenie bezpośrednie. Np. Jeśli pliki nagłówkowe innej biblioteki są dołączane tylko bezpośrednio do twoich plików nagłówkowych, ale wszystkie twoje pliki nagłówkowe są zawarte w twoich plikach źródłowych, wtedy twoje pliki źródłowe przechodnie zawierają pliki nagłówkowe drugiej biblioteki, więc masz PUBLICzależność, a nie INTERFACEzależność.
Ose
Dokumentacja cmake powinna być tak zwięzła, jak ta odpowiedź!
Bryan Jyh Herng Chong
4

@steveire zaakceptowana odpowiedź jest świetna. Chciałem tylko dodać tabelę, aby szybko zobaczyć różnicę:

.-----------.------------------.----------------.
|           | Linked by target | Link interface |
:-----------+------------------+----------------:
| PUBLIC    |        X         |        X       |
:-----------+------------------+----------------:
| PRIVATE   |        X         |                |
:-----------+------------------+----------------:
| INTERFACE |                  |        X       |
'-----------'------------------'----------------'
  • Połączone przez cel : biblioteki zawarte w źródłach docelowych (nie jest to zależność dla projektów łączących bibliotekę).
  • Interfejs linków : biblioteki zawarte w docelowych nagłówkach publicznych (zależności dla projektów łączących bibliotekę).
ikaro
źródło
0

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.

WangJian
źródło