Залежності інтерфейсу CMake target_link_libraries


99

Я новачок у CMake і трохи плутаю ключові слова PUBLIC, PRIVATE та INTERFACE, пов'язані з target_link_libraries(). У документації згадується, що їх можна використовувати для вказівки як залежностей посилань, так і інтерфейсу посилання в одній команді.

Що насправді означають залежності та інтерфейс посилань?


1
Схожий питання: stackoverflow.com/questions/26243169 / ...
TManhente

Відповіді:


201

Якщо ви створюєте спільну бібліотеку та вихідні файли cpp #include заголовки іншої бібліотеки (скажімо, QtNetwork, наприклад), але ваші файли заголовків не містять заголовків QtNetwork, тоді QtNetwork - це PRIVATEзалежність.

Якщо ваші вихідні файли та ваші заголовки містять заголовки іншої бібліотеки, то це PUBLICзалежність.

Якщо ваші файли заголовків, але не вихідні, містять заголовки іншої бібліотеки, то це INTERFACEзалежність.

Інші властивості побудови PUBLICта INTERFACEзалежності поширюються на споживаючі бібліотеки. http://www.cmake.org/cmake/help/v3.0/manual/cmake-buildsystem.7.html#transitive-usage-requirements


40
Це найбільш чітке пояснення цього питання, яке я коли-небудь чув. Я хотів би, щоб документація cmake була якомога чіткішою! :-)
Ela782

1
Дякую за пояснення. Зараз я розумію значення, але чому це конкретизує PUBLICчи PRIVATEмає значення? Що це змінює?
user3667089

8
Використання PRIVATEне додає ваших залежностей до проектів, що посилаються на вашу бібліотеку. Він чистіший, а також дозволяє уникнути можливих конфліктів між вашими залежностями та вашими користувачами.
user2658323

7
@steveire Для наочності може бути варто чітко зазначити, що "включити" означає транзитивне включення, а не просто пряме включення. Наприклад, якщо файли заголовків іншої бібліотеки включені лише безпосередньо вашими файлами заголовків, але всі ваші файли заголовків включені вашими вихідними файлами, тоді ваші вихідні файли транзитивно включають файли заголовків іншої бібліотеки, і тому у вас є PUBLICзалежність, а не INTERFACEзалежність.
Озе

Документація cmake повинна писати її так само стисло, як і відповідь!
Bryan Jyh Herng Chong
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.