2014-10-07 186 views

回答

38

這些關鍵字用於告訴何時需要傳遞給目標的包含目錄列表。通過,這意味着如果這些包括需要的目錄:

  • 要編譯目標本身。
  • 編譯依賴於該目標的其他目標(如使用其公共標題)。
  • 在上述兩種情況下。

當CMake的被編譯的目標,它使用目標INCLUDE_DIRECTORIESCOMPILE_DEFINITIONSCOMPILE_OPTIONS性能。當您在target_include_directories()等中使用PRIVATE關鍵字時,您告訴CMake填充這些目標屬性。

當CMake的檢測目標A和另一靶B(當使用target_link_libraries(A B)命令等)之間的相關性,它傳遞地傳播B使用要求A目標。那些目標使用要求是包含目錄,編譯定義等,依賴於B的任何目標都必須符合。它們由INTERFACE_*版本的上述屬性(如INTERFACE_INCLUDE_DIRECTORIES)指定,並在調用target_*()命令時使用INTERFACE關鍵字填充。

PUBLIC關鍵字的意思是大致PRIVATE + INTERFACE

因此,假設您正在創建使用某些Boost標頭的庫A。你會做:

  • target_include_directories(A PRIVATE ${Boost_INCLUDE_DIRS})如果你只使用你的源文件(.cpp)或私有的頭文件(.h)裏面那些Boost頭。
  • target_include_directories(A INTERFACE ${Boost_INCLUDE_DIRS})如果您不在源文件中使用這些Boost標頭(因此,不需要它們來編譯A)。我實際上無法爲此考慮一個真實世界的例子。
  • target_include_directories(A PUBLIC ${Boost_INCLUDE_DIRS})如果您在公共頭文件中使用這些Boost標頭,這些頭文件包含在A的某些源文件中,也可能包含在A庫的任何其他客戶端中。

CMake 3.0文檔有關於此build specification and usage requirements屬性的更多詳細信息。

+0

關於'INTERFACE'的現實例子。 'target_include_directories(libname INTERFACE include PRIVATE include/libname)'。這意味着你的庫中可以直接包含文件,但作爲庫的用戶,你必須首先插入'libname /'。 – KaareZ 2017-12-16 14:39:20

8

INTERFACE,PUBLIC和PRIVATE關鍵字需要指定以下參數的 範圍。 PRIVATE和PUBLIC項目將 填充< target>的INCLUDE_DIRECTORIES屬性。 PUBLIC和 INTERFACE項目將填充< target>的INTERFACE_INCLUDE_DIRECTORIES 屬性。以下參數指定包括 目錄。

從文檔:http://www.cmake.org/cmake/help/v3.0/command/target_include_directories.html

要以我自己的話改寫文檔:

  • 要一個目錄添加到列表中包括目錄的目標
  • 與私人的目錄被添加到目標的包含目錄中
  • 帶有INTERFACE目標未被修改,但INTERFACE_INCLUDE_DIRECTORIES被擴展該目錄。該變量是庫的公共包含目錄的列表。
  • 使用PUBLIC執行來自PRIVATE和INTERFACE的操作。
+3

我經歷了CMAKE文檔,但我仍然沒有得到他們實際上的意思,在什麼情況下(使文件或如何編譯) ? – Poorna 2014-10-07 19:25:22

+0

@Sirish:我試圖改寫文檔,希望有所幫助。 – usr1234567 2014-10-20 12:16:29