я не дошёл сам.
Подскажите как идейно в плюсах принято дистрибютить заголовочные файлы?
Например, есть у меня следующая структура
- include
libfoo.hpp
- src
libfoo\
libfoo.cpp
main.cpp
В libfoo.hpp у меня декларация класса, реализация которой в libfoo.cpp. Но, что я пока не совсем понимаю - в libfoo.hpp у меня есть приватная секция (поля, методы), которая не является API. Как мне дистрибьютить libfoo.hpp + собранную libfoo.so не шаря с народом внутреннюю реализацию?
Вопрос наверное идиотский :) Сори если вопрос совсем глупый. Можно в плюсах иметь у класса 2 хедера - один, который нужен только при сборке и там внутренняя кухня, второй - публичный интерфейс?
Как угодно. Просто текстовые файлы, желательно в одном подкаталоге. Но никаких правил жёстких нет.
Про приватные секции -- либо ты их выдаёшь наружу как есть, либо -- перемещаешь в отдельный заголовочный файл, который НЕ выдаёшь и используешь только в исходном модуле с реализацией.
Можно в плюсах иметь у класса 2 хедера - один, который нужен только при сборке и там внутренняя кухня, второй - публичный интерфейс? -- можно, хоть ДЕСЯТЬ заголовков. Но больше десяти -- НЕЛЬЗЯ ( :
Можно pimpl использовать, если прям хочется скрыть внутреннюю реализацию. Или иметь два набора апи, публичный, который выставляешь наружу и внутренний, на котором уже работает реализация библиотеки. Они даже могут общаться друг с другом через какую-то прослойку, например на си. Так сделано в ex-intel mkl dnn, например, да и во многих других библиотеках.
До PIMPL пока ещё не дошли, пока нет в нём нужды очевидной.
Очень хорошо, а можно ссылку на почитать как второе делается? Или ссылку на любой проект где такое применяется? Чтобы я тут не флудил детскими вопросами. Я же правильно понимаю у 1 класса может быть 2 хедера - в одном хедере его публичная часть, в втором - приватная? Или я не правильно понял?
Нет никакой ссылки, просто сделай два файла из одного, разделив куски.
можно паттерн мост заюзать
Если всё так просто, то это просто волшебно (: Спасибо
Всё НЕ ТАК просто.
дистрибьютить libfoo.so - плохое решение, если только это не что-то проприетарное
пакетные менеджеры так делают же libfoo.deb, devlibfoo.deb
дистрибьютят сорцы, а из них уже собирают target_add_library(hello-world PRIVATE foo-lib)
ну смотря какая задача
пакетные менеджеры завязаны на дистрибутив, конкретную ось и тулчейн, если задача сделать нормальную кроссплатформенную либу, то cmake и сорцов достаточно
Да, это я понимаю, безусловно
Обсуждают сегодня