ターゲット、リンク、可視性:PUBLIC、PRIVATE
ターゲットを定義し、ライブラリをリンクして、PUBLIC、PRIVATE、INTERFACEの可視性を正しく使います。
「ターゲット、リンク、可視性:PUBLIC、PRIVATE」はCoddyKit上の無料C++ Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これは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
ターゲットをライブラリにリンクします。3番目の引数で公開範囲を制御します。
target_link_libraries(myapp PRIVATE mylib)PUBLIC PRIVATE INTERFACEの公開範囲
公開範囲には3つのレベルがあります。ターゲットの依存関係を、そのターゲットの利用者に伝播させるかどうかを制御します。
- PRIVATE — このターゲットのビルドに使用します。公開されません
- INTERFACE — 利用者が使用します。このターゲット自体では使用しません
- PUBLIC — 両方で使用します
伝播を可視化する
mylibがfmtをPUBLICとしてリンクすると、mylibをリンクするすべてのターゲットがfmtのインクルードディレクトリも取得します。PRIVATEの場合、利用者からfmtは見えません。
target_include_directories
ターゲットごとにインクルードディレクトリを設定します。利用者が#includeするヘッダーにはPUBLICを、内部ヘッダーには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を使用します。
確認問題
mylibをリンクするターゲットにとって、target_link_libraries(mylib PUBLIC fmt)は何を意味しますか。
まとめ
モダンなCMakeでは、ターゲットを作業単位として扱います。target_*コマンドでプロパティを設定し、PUBLIC、PRIVATE、INTERFACEを使って、利用者へのプロパティの伝播方法を制御してください。
よくある質問
「ターゲット、リンク、可視性:PUBLIC、PRIVATE」レッスンは無料ですか?
はい。「ターゲット、リンク、可視性:PUBLIC、PRIVATE」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C++ Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C++ Academyコースには全4レッスンが含まれています。
「ターゲット、リンク、可視性:PUBLIC、PRIVATE」で何を学びますか?
ターゲットを定義し、ライブラリをリンクして、PUBLIC、PRIVATE、INTERFACEの可視性を正しく使います。 ブラウザで直接実行するハンズオンコードでC++ Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
C++ Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのC++ Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。
「ターゲット、リンク、可視性:PUBLIC、PRIVATE」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このC++ Academyレッスンでコードを書いて実行できますか?
はい。すべてのC++ Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- CMakeプロジェクトの構成とCMakeLists.txt
- ターゲット、リンク、可視性:PUBLIC、PRIVATE
- 依存関係にvcpkgとConanを使う
- IDEファイルの生成とクロスプラットフォームビルド