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

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

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

12 ответов

29 просмотров

все гуглится, особенно это видео 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.

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

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

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта