簡體   English   中英

cmake 中何時應使用 PUBLIC/PRIVATE/INTERFACE 的示例

[英]Examples of when PUBLIC/PRIVATE/INTERFACE should be used in cmake

我正在讀關於cmake的關鍵字PUBLICPRIVATEINTERFACE和整個本段來到這里在cmake的文檔。

通常,如果依賴項僅用於庫的實現而不是在頭文件中,則應在使用 target_link_libraries() 和 PRIVATE 關鍵字時指定依賴項。 如果在庫的頭文件中額外使用了依賴項(例如用於類繼承),則應將其指定為 PUBLIC 依賴項。 庫的實現不使用而僅由其頭文件使用的依賴項應指定為 INTERFACE 依賴項。

我了解您在這三個關鍵字之間的選擇如何影響target_link_librariestarget_include_directories的行為,但我不明白本段中解釋的三種情況之間的區別。 有人可以提供一個玩具的例子嗎

  1. 在庫的實現中使用依賴項,但不在頭文件中( PRIVATE
  2. 在庫的實現和頭文件( PUBLIC )中使用依賴項
  3. 在庫的頭文件中使用依賴項,但不在實現中( INTERFACE

讓我們首先處理PUBLICPRIVATE

假設您正在編寫一個帶有 Qt GUI 的工具。 你這個 GUI 應該允許你使用插件動態地向 GUI 添加元素。 此外,用戶應該能夠通過設置激活和停用插件,並且需要在未來啟動程序時激活相同的插件。

因此,您的庫提供了 2 個功能:

  1. 創建 Qt GUI 元素。 您需要在公共頭文件中使用 Qt 中的類型,因此您將 Qt 包含添加到這些頭文件中。 每個庫都需要訪問 Qt 頭文件,因此您可以鏈接 Qt PUBLIC ly
  2. 為了保持插件設置,您選擇 Boost.JSON 將設置存儲在文件系統上給定位置的文件中。 您的庫的用戶實際上不會自己處理 JSON 解析/編寫,因此您不要在公共標題中包含任何 boost 標題並鏈接 Boost.JSON PRIVATE ly。

INTERFACE可見性

您很少會使用此可見性。 通常你需要訪問標題等。 在你自己的圖書館里。

值得注意的例外是只有頭文件的庫。 這些實際上不會導致在您的構建系統中創建目標,並且它們不能單獨構建。 CMake 目標本身只是一種通過target_link_libraries提供頭文件和依賴庫的便捷方式。

另一個例外是導入的目標。 這些也不會編譯為您項目的一部分。 它們只包含有關已經構建的庫的信息。 對於導入的目標,您只能使用INTERFACE可見性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM