Цели, связывание и видимость: PUBLIC, PRIVATE
Определяйте цели, связывайте библиотеки и корректно используйте видимость PUBLIC, PRIVATE, INTERFACE.
«Цели, связывание и видимость: PUBLIC, PRIVATE» — бесплатный урок C++ Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения C++ Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс C++ Academy содержит 4 уроков всего.
Цели как единица сборки
Современный CMake строится вокруг целей — исполняемых файлов, библиотек или наборов, предназначенных только для интерфейса. Свойства прикрепляются к целям и передаются через связывание.
Добавление целей
Используйте add_executable, add_library или add_library(... INTERFACE).
add_executable(myapp src/main.cpp)
add_library(mylib STATIC src/lib.cpp)
add_library(headers INTERFACE)target_link_libraries
Свяжите цель с библиотеками. Третий аргумент управляет видимостью.
target_link_libraries(myapp PRIVATE mylib)Видимость PUBLIC PRIVATE INTERFACE
Три уровня видимости — они управляют тем, передаются ли зависимости потребителям этой цели:
- PRIVATE — используется для сборки этой цели, но не предоставляется внешнему коду
- INTERFACE — используется потребителями, но не этой целью
- PUBLIC — используется обоими
Визуализация передачи свойств
Если mylib связывает fmt как PUBLIC, любая цель, связывающая mylib, также получает каталоги включения fmt. PRIVATE означает, что потребители не видят fmt.
target_include_directories
Задавайте каталоги включения для каждой цели. Используйте PUBLIC для заголовочных файлов, которые потребители будут подключать с помощью #include; PRIVATE — для внутренних заголовочных файлов.
target_include_directories(mylib
PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include
PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src
)target_compile_definitions
Задавайте макросы препроцессора для цели.
target_compile_definitions(mylib PUBLIC MYLIB_VERSION_MAJOR=1)target_compile_features
Запрашивайте определённые возможности языка, например стандарт C++.
target_compile_features(mylib PUBLIC cxx_std_20)Интерфейсные библиотеки
Библиотека INTERFACE не создаёт скомпилированных файлов. Используйте её для объединения параметров компиляции, заголовочных файлов или связей, которые должны наследоваться потребителями.
add_library(strict_warnings INTERFACE)
target_compile_options(strict_warnings INTERFACE -Wall -Wextra)
# now any target can opt in
target_link_libraries(myapp PRIVATE strict_warnings)Библиотеки только из заголовочных файлов
Для библиотек только из заголовочных файлов объявите библиотеку INTERFACE и задайте каталог включения как INTERFACE.
Псевдонимы
Создавайте псевдонимы с пространствами имён для более понятных команд связывания.
add_library(MyProject::mylib ALIAS mylib)
target_link_libraries(consumer PRIVATE MyProject::mylib)Порядок связывания
CMake обычно правильно определяет порядок связывания. В сложных циклических случаях используйте флаг связывателя --start-group или измените структуру библиотек.
Распространённая ошибка: глобальная команда include_directories
Избегайте глобальной команды include_directories. Используйте target_include_directories, чтобы заголовочные файлы прикреплялись только к определённым целям.
Быстрая проверка
Что означает target_link_libraries(mylib PUBLIC fmt) для цели, которая связывает mylib?
Итоги
Современный CMake использует цели как единицу работы. Задавайте свойства с помощью команд target_* и используйте PUBLIC/PRIVATE/INTERFACE, чтобы управлять передачей свойств потребителям.
Изучай C++ с ИИ-репетитором — бесплатно
Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.
- Курсы
- 51
- Уроки
- 203
Часто задаваемые вопросы
Урок «Цели, связывание и видимость: PUBLIC, PRIVATE» бесплатный?
Да — полный текст урока «Цели, связывание и видимость: PUBLIC, PRIVATE» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс C++ Academy, подпишись на CoddyKit PRO. Курс C++ Academy содержит 4 уроков всего.
Чему я научусь в уроке «Цели, связывание и видимость: PUBLIC, PRIVATE»?
Определяйте цели, связывайте библиотеки и корректно используйте видимость PUBLIC, PRIVATE, INTERFACE. Ты практикуешь C++ Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать C++ Academy?
Предыдущий опыт не требуется. C++ Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.
Сколько времени занимает урок «Цели, связывание и видимость: PUBLIC, PRIVATE»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке C++ Academy?
Да. Каждый урок C++ Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Структура проекта CMake и CMakeLists.txt
- Цели, связывание и видимость: PUBLIC, PRIVATE
- Использование vcpkg и Conan для зависимостей
- Генерация файлов IDE и кроссплатформенная сборка