C++ Academy · Урок

Цели, связывание и видимость: PUBLIC, PRIVATE

Определяйте цели, связывайте библиотеки и корректно используйте видимость PUBLIC, PRIVATE, INTERFACE.

Урок 2 из 415 шагов

«Цели, связывание и видимость: 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 — локальная установка не требуется.

Все уроки этого курса

  1. Структура проекта CMake и CMakeLists.txt
  2. Цели, связывание и видимость: PUBLIC, PRIVATE
  3. Использование vcpkg и Conan для зависимостей
  4. Генерация файлов IDE и кроссплатформенная сборка
← Назад к C++ Academy