0Pricing
C++ Academy · レッスン

ターゲット、リンク、可視性: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フィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. CMakeプロジェクトの構成とCMakeLists.txt
  2. ターゲット、リンク、可視性:PUBLIC、PRIVATE
  3. 依存関係にvcpkgとConanを使う
  4. IDEファイルの生成とクロスプラットフォームビルド
← C++ Academyに戻る