CMaketarget_link_librariesインターフェースの依存関係


99

私はCMakeを初めて使用し、に関連するPUBLIC、PRIVATE、およびINTERFACEキーワードと少し混乱していtarget_link_libraries()ます。ドキュメントには、1つのコマンドでリンクの依存関係とリンクインターフェイスの両方を指定するために使用できると記載されています。

リンクの依存関係とリンクインターフェイスは実際にはどういう意味ですか?


回答:


201

共有ライブラリを作成していて、ソースcppファイルに別のライブラリ(たとえばQtNetwork)のヘッダーが含まれているが、ヘッダーファイルにQtNetworkヘッダーが含まれていない場合、QtNetworkはPRIVATE依存関係になります。

ソースファイルとヘッダーに別のライブラリのヘッダーが含まれている場合、それはPUBLIC依存関係です。

ソースファイルではなくヘッダーファイルに別のライブラリのヘッダーが含まれている場合、それはINTERFACE依存関係です。

その他のビルドプロパティPUBLICINTERFACE依存関係は、消費ライブラリに伝播されます。http://www.cmake.org/cmake/help/v3.0/manual/cmake-buildsystem.7.html#transitive-usage-requirements


40
これは私が今まで聞いたこの質問の最も明確な説明です。cmakeのドキュメントが同じくらい明確だったらいいのにと思います!:-)
Ela782 2016

1
説明ありがとうございます今は意味がわかりましたが、なぜ特定しPUBLICたりPRIVATE重要なのですか?それは何を変えますか?
user3667089 2017年

8
を使用PRIVATEしても、ライブラリにリンクしているプロジェクトに依存関係は追加されません。それはよりクリーンであり、依存関係とユーザーの間で起こりうる競合を回避します。
user2658323 2017

7
@steveireわかりやすくするために、「含む」は直接的な包含だけでなく、推移的な包含を意味することを明示的に述べる価値があるかもしれません。たとえば、別のライブラリのヘッダーファイルがヘッダーファイルに直接インクルードされているだけで、すべてのヘッダーファイルがソースファイルにインクルードされている場合、ソースファイルには他のライブラリのヘッダーファイルが一時的にインクルードされるため、PUBLIC依存関係はありません。INTERFACE依存関係。
大瀬

cmakeのドキュメントには、この回答と同じくらい簡潔に書く必要があります。
Bryan Jyh Herng Chong
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.