слова PUBLIC, INTERFACE и PRIVATE в команде target_link_library? Как запилить базовый пример, который демонстрировал бы явные различия?
все гуглится, особенно это видео https://www.youtube.com/watch?v=8hoZpwDMVME&list=PL6x9Hnsyqn2UwWjSvjCzAY6sEOBrHY7VH&index=7
Это про транзитивные зависимости
Какие ограничения накладывает PRIVATE? Он не может запретить мне вызвать что либо из либ, которые подключаются через PRIVATE, как бы глубоко они не были спрятаны в нижележащих проектах. Я хочу увидеть именно ограничения, накладываемые PRIVATE или тут речь только о пересборке, в случае вносимых изменений?
На 1:56 он нагло врёт про то, что myexe ничего не знает о libB. Знает, и я могу дёргать методы классов либы libB.
Он позволяет вызвать ровно то из нижележащей либы, что она определила как не-private. То, что у неё private - вы никак не увидите. Можно для иллюстрации экспортировать такую либу и посмотреть в свойства экспорт-файла. Увидите там её объявление (как static/dynamic, либо unknown); её файлы/папки; её зависимости (interface)- но ни следа от private-зависимостей. Дальше уж как попрёт - если будут две разные версии одной либы (тот же буст) в приватах разных либ, и если будет конфликт имён - увидете это в ошибке линкера. Но cmake тут уже не причём; сами либы при билде выбирают, экспортить ли ВСЕ символы наружу, или только избранные. Если прямо все - то две версии разных приватных либ могут между собой поругаться.
Ничего мне не запрещает вызывать символы ниже лежащих проектов, объявленных private и более того даже нет конфликта имён. Допустим, есть у меня проект myExe, который подключает libA, который подключает libB. Если у меня в libB будет определена функция void foo() в myExe и в libB, то при вызове из myExe произойдёт вызов определения из myExe. Если я уберу определение void foo(), то вызов произойдёт версии из libB. Никаких конфликтов.
Что такое нарушение ODR?
https://en.m.wikipedia.org/wiki/One_Definition_Rule
[build] [ 33%] Built target libB [build] [ 66%] Built target libA [build] [ 83%] Linking CXX executable myApp.exe Всё слинковалось, так?
И всё равно из этого примера не понятно чем отличается PRIVATE от PUBLIC.
Обсуждают сегодня