CMake target_link_libraries Зависимости интерфейса

99

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

Что на самом деле означают зависимости ссылок и интерфейс ссылок?

Сириш
источник
1
Аналогичный вопрос: stackoverflow.com/questions/26243169/…
TManhente

Ответы:

202

Если вы создаете разделяемую библиотеку и ваши исходные файлы cpp # включают заголовки другой библиотеки (скажем, 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 07
1
Спасибо за объяснение. Теперь я понимаю смысл, но почему уточнение PUBLICили PRIVATEимеет значение? Что это меняет?
user3667089
8
Использование PRIVATEне добавляет ваши зависимости к проектам, связанным с вашей библиотекой. Он чище, а также позволяет избежать возможных конфликтов между вашими зависимостями и вашим пользователем.
user2658323
7
@steveire Для ясности, возможно, стоит прямо указать, что «включить» означает транзитивное включение, а не просто прямое включение. Например, если файлы заголовков другой библиотеки включены только напрямую в ваши файлы заголовков, но все ваши файлы заголовков включены в исходные файлы, то ваши исходные файлы транзитивно включают файлы заголовков другой библиотеки, и поэтому у вас есть PUBLICзависимость, а не INTERFACEзависимость.
Ose
Документация по cmake должна быть такой же краткой, как и этот ответ!
Bryan Jyh Herng Chong,