Я новичок в CMake и немного запутался ключевыми словами PUBLIC, PRIVATE и INTERFACE, относящимися к target_link_libraries()
. В документации упоминается, что их можно использовать для указания как зависимостей ссылок, так и интерфейса ссылки в одной команде.
Что на самом деле означают зависимости ссылок и интерфейс ссылок?
Ответы:
Если вы создаете разделяемую библиотеку и ваши исходные файлы 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источник
PUBLIC
илиPRIVATE
имеет значение? Что это меняет?PRIVATE
не добавляет ваши зависимости к проектам, связанным с вашей библиотекой. Он чище, а также позволяет избежать возможных конфликтов между вашими зависимостями и вашим пользователем.PUBLIC
зависимость, а неINTERFACE
зависимость.