C++ Academy · Lekcja

Cele, linkowanie i widoczność: PUBLIC, PRIVATE

Definiuj cele, linkuj biblioteki i poprawnie używaj widoczności PUBLIC, PRIVATE oraz INTERFACE

Lekcja 2 z 415 kroki

Cele, linkowanie i widoczność: PUBLIC, PRIVATE to bezpłatna lekcja C++ Academy na CoddyKit. To lekcja 2 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej C++ Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs C++ Academy zawiera 4 lekcji w sumie.

Cele są jednostką kompilacji

Nowoczesny CMake koncentruje się na celach — plikach wykonywalnych, bibliotekach lub zestawach dostępnych wyłącznie przez interfejs. Właściwości są przypisywane celom i propagowane za pośrednictwem linkowania.

Dodawanie celów

Należy używać add_executable, add_library lub add_library(... INTERFACE).

add_executable(myapp src/main.cpp)
add_library(mylib STATIC src/lib.cpp)
add_library(headers INTERFACE)

target_link_libraries

Łączy cel z bibliotekami. Trzeci argument określa widoczność.

target_link_libraries(myapp PRIVATE mylib)

Widoczność PUBLIC PRIVATE INTERFACE

Trzy poziomy widoczności — określają, czy zależności są przekazywane użytkownikom tego celu:

  • PRIVATE — używane do budowania tego celu, niewidoczne na zewnątrz
  • INTERFACE — używane przez użytkowników celu, ale nie przez sam cel
  • PUBLIC — oba powyższe zastosowania

Wizualizacja propagowania właściwości

Jeśli mylib łączy fmt jako PUBLIC, każdy cel łączący się z mylib otrzymuje również katalogi dołączania fmt. PRIVATE oznacza, że użytkownicy celu nie widzą fmt.

target_include_directories

Ustawia katalogi dołączania dla poszczególnych celów. Należy używać PUBLIC dla plików nagłówkowych, które użytkownicy będą dołączać za pomocą #include, oraz PRIVATE dla plików nagłówkowych wewnętrznych.

target_include_directories(mylib
    PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include
    PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src
)

target_compile_definitions

Ustawia makra preprocesora dla celu.

target_compile_definitions(mylib PUBLIC MYLIB_VERSION_MAJOR=1)

target_compile_features

Żąda określonych funkcji języka, na przykład konkretnego standardu C++.

target_compile_features(mylib PUBLIC cxx_std_20)

Biblioteki interfejsowe

Biblioteka INTERFACE nie tworzy skompilowanego pliku wynikowego. Należy jej używać do grupowania opcji kompilacji, plików nagłówkowych lub linkowań, które użytkownicy celu powinni dziedziczyć.

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)

Biblioteki bez plików źródłowych

W przypadku bibliotek zawierających wyłącznie pliki nagłówkowe należy zadeklarować bibliotekę INTERFACE i ustawić katalog dołączania jako INTERFACE.

Aliasy

Należy tworzyć aliasy z przestrzeniami nazw, aby polecenia linkowania były bardziej przejrzyste.

add_library(MyProject::mylib ALIAS mylib)
target_link_libraries(consumer PRIVATE MyProject::mylib)

Kolejność linkowania

CMake zwykle prawidłowo ustala kolejność linkowania. W trudnych przypadkach z cyklicznymi zależnościami należy użyć flagi linkera --start-group albo zmienić strukturę bibliotek.

Typowy błąd: globalne include_directories

Należy unikać globalnego polecenia include_directories. Zamiast niego należy używać target_include_directories, aby pliki nagłówkowe były przypisywane wyłącznie do konkretnych celów.

Szybkie sprawdzenie

Co oznacza target_link_libraries(mylib PUBLIC fmt) dla celu, który łączy się z mylib?

Podsumowanie

Nowoczesny CMake wykorzystuje cele jako jednostki pracy. Właściwości należy ustawiać za pomocą poleceń target_*, a PUBLIC/PRIVATE/INTERFACE służą do kontrolowania propagowania właściwości do użytkowników celu.

Bezpłatny start

Ucz się C++ dzięki korepetycjom AI — za darmo

Pisz i uruchamiaj kod w przeglądarce, otrzymuj natychmiastową pomoc od korepetytora AI dostępnego 24/7 i kontynuuj naukę w sieci lub w aplikacji.

Kursy
51
Lekcje
203

Często zadawane pytania

Czy lekcja „Cele, linkowanie i widoczność: PUBLIC, PRIVATE” jest bezpłatna?

Tak — pełny tekst „Cele, linkowanie i widoczność: PUBLIC, PRIVATE” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu C++ Academy, przejdź na CoddyKit PRO. Kurs C++ Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Cele, linkowanie i widoczność: PUBLIC, PRIVATE”?

Definiuj cele, linkuj biblioteki i poprawnie używaj widoczności PUBLIC, PRIVATE oraz INTERFACE Ćwiczysz C++ Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć C++ Academy?

Nie wymagamy żadnego doświadczenia. C++ Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 2 z 4.

Ile czasu zajmuje lekcja „Cele, linkowanie i widoczność: PUBLIC, PRIVATE”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji C++ Academy?

Tak. Każda lekcja C++ Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Układ projektu CMake i CMakeLists.txt
  2. Cele, linkowanie i widoczność: PUBLIC, PRIVATE
  3. Używanie vcpkg i Conan do zarządzania zależnościami
  4. Generowanie plików IDE i kompilacje wieloplatformowe
← Powrót do C++ Academy