Cele, linkowanie i widoczność: PUBLIC, PRIVATE
Definiuj cele, linkuj biblioteki i poprawnie używaj widoczności PUBLIC, PRIVATE oraz INTERFACE
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.
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
- Układ projektu CMake i CMakeLists.txt
- Cele, linkowanie i widoczność: PUBLIC, PRIVATE
- Używanie vcpkg i Conan do zarządzania zależnościami
- Generowanie plików IDE i kompilacje wieloplatformowe