207 похожих чатов

Может кто-нибудь объяснить что же на самом деле делают ключевые

слова PUBLIC, INTERFACE и PRIVATE в команде target_link_library? Как запилить базовый пример, который демонстрировал бы явные различия?

12 ответов

10 просмотров

все гуглится, особенно это видео https://www.youtube.com/watch?v=8hoZpwDMVME&list=PL6x9Hnsyqn2UwWjSvjCzAY6sEOBrHY7VH&index=7

Это про транзитивные зависимости

eugene-martein Автор вопроса
Kirill
все гуглится, особенно это видео https://www.youtu...

Какие ограничения накладывает PRIVATE? Он не может запретить мне вызвать что либо из либ, которые подключаются через PRIVATE, как бы глубоко они не были спрятаны в нижележащих проектах. Я хочу увидеть именно ограничения, накладываемые PRIVATE или тут речь только о пересборке, в случае вносимых изменений?

eugene-martein Автор вопроса
Kirill
все гуглится, особенно это видео https://www.youtu...

На 1:56 он нагло врёт про то, что myexe ничего не знает о libB. Знает, и я могу дёргать методы классов либы libB.

eugene martein
Какие ограничения накладывает PRIVATE? Он не может...

Он позволяет вызвать ровно то из нижележащей либы, что она определила как не-private. То, что у неё private - вы никак не увидите. Можно для иллюстрации экспортировать такую либу и посмотреть в свойства экспорт-файла. Увидите там её объявление (как static/dynamic, либо unknown); её файлы/папки; её зависимости (interface)- но ни следа от private-зависимостей. Дальше уж как попрёт - если будут две разные версии одной либы (тот же буст) в приватах разных либ, и если будет конфликт имён - увидете это в ошибке линкера. Но cmake тут уже не причём; сами либы при билде выбирают, экспортить ли ВСЕ символы наружу, или только избранные. Если прямо все - то две версии разных приватных либ могут между собой поругаться.

eugene-martein Автор вопроса

Ничего мне не запрещает вызывать символы ниже лежащих проектов, объявленных private и более того даже нет конфликта имён. Допустим, есть у меня проект myExe, который подключает libA, который подключает libB. Если у меня в libB будет определена функция void foo() в myExe и в libB, то при вызове из myExe произойдёт вызов определения из myExe. Если я уберу определение void foo(), то вызов произойдёт версии из libB. Никаких конфликтов.

eugene-martein Автор вопроса
Alex Noname
Ужас. Нарушил odr

Что такое нарушение ODR?

eugene martein
Что такое нарушение ODR?

https://en.m.wikipedia.org/wiki/One_Definition_Rule

eugene-martein Автор вопроса
Alex Noname
Ужас. Нарушил odr

[build] [ 33%] Built target libB [build] [ 66%] Built target libA [build] [ 83%] Linking CXX executable myApp.exe Всё слинковалось, так?

eugene-martein Автор вопроса
Kirill
все гуглится, особенно это видео https://www.youtu...

И всё равно из этого примера не понятно чем отличается PRIVATE от PUBLIC.

Похожие вопросы

Обсуждают сегодня

коллеги привет. уже второй день бьемся об заклад с одной ошибкой, может вы сталкивались с таки странным поведением? есть тестовый сервер, на который паблишим релизную версию W...
Magzhan
11
кому не сложно распишите пожалуйста для какой цели тут вот эти скобки и в них пихается указатель?
Михаил Helper
11
Комрады, посоветуйте, куда копать? Стал прикручивать кастомизацию тем. В OnShow главной главной формы пытаюсь загрузить из файла настроек и применить тему (на скрине, как долж...
Ed Doc
13
Такс, блин, таки кто-то знает, каким образом работают макросы stdin/stdout/stderr? Я влез в stdio.h, там определения нет, отладил через асмокод - вызывается функция со странны...
The Bird of Hermes
18
OnShow один раз вызывается? или возможен Hide?
Iluha Companets
14
я не магистр хаскеля, но разве не может лейзи тип конвертнуться в не-лейзи запросив вычисление содержимого прям при инициализации?
deadgnom32 λ madao
100
Если у меня есть такой класс: Object = {} function Object:new(a_name, a_transform, a_color, a_mesh, a_material, a_shader, a_textures) local private = {} private.n...
Cuarno Vile
4
Всем привет, на линуксе лучше на fasm или nasm учиться писать для начала ?
meszjol
14
А еще в перле можно уже @arr1 + @arr2?
Sergei Zhmylove
53
@MrMiscipitlick А можешь макрос написать, который будет вычислять смещение относительно переданных меток? Просто .label1-.label2, и вернуть значение.
КТ315
35
Карта сайта