與CMake的target_include_directories
相關的關鍵字PUBLIC
,PRIVATE
和INTERFACE
的含義是什麼?CMake target_include_directories範圍的含義
回答
這些關鍵字用於告訴何時需要傳遞給目標的包含目錄列表。通過當,這意味着如果這些包括需要的目錄:
- 要編譯目標本身。
- 編譯依賴於該目標的其他目標(如使用其公共標題)。
- 在上述兩種情況下。
當CMake的被編譯的目標,它使用目標INCLUDE_DIRECTORIES
,COMPILE_DEFINITIONS
和COMPILE_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屬性的更多詳細信息。
關於'INTERFACE'的現實例子。 'target_include_directories(libname INTERFACE include PRIVATE include/libname)'。這意味着你的庫中可以直接包含文件,但作爲庫的用戶,你必須首先插入'libname /'。 – KaareZ 2017-12-16 14:39:20
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的操作。
我經歷了CMAKE文檔,但我仍然沒有得到他們實際上的意思,在什麼情況下(使文件或如何編譯) ? – Poorna 2014-10-07 19:25:22
@Sirish:我試圖改寫文檔,希望有所幫助。 – usr1234567 2014-10-20 12:16:29
- 1. 命令cmake_policy [cmake]的含義?
- 2. PHP爲包含文件定義範圍
- 3. SWIG和CMake:利用`target_include_directories()提供的信息`
- 4. Rails包含範圍
- 5. 定義範圍值
- 6. $範圍未定義
- 7. std :: uniform_real_distribution包含範圍
- 8. IronRuby,DLR,範圍包含
- 9. PHP包含和類範圍
- 10. Ruby類,包含和範圍
- 11. 包含範圍上限()
- 12. 通過行的含義範圍減少行數int data.frame
- 13. 在不同範圍內具有不同含義的功能
- 14. 將日期範圍和時間範圍組合到一組結果中,該結果包含日期範圍中包含的每一天的時間範圍SQL
- 15. Angularjs自定義指令範圍:true更改它的父範圍
- 16. 在本地範圍內定義全局範圍的變量
- 17. 從另一個範圍的值中定義一個範圍
- 18. 包含某些值的Excel範圍
- 19. 列表的包含範圍Python
- 20. JFreeChart域/範圍軸定義
- 21. 如何定義$ ionicLoading範圍?
- 22. 自定義範圍輸入
- 23. $範圍未定義 - codepen
- 24. 定義動態範圍
- 25. 定義整數範圍C
- 26. 用範圍內定義
- 27. preg_replace自定義範圍
- 28. 如何使用CMake修改導入庫的範圍
- 29. 在宏觀範圍內的Cmake全局變量
- 30. AngularJs:訪問父範圍,我得到範圍未定義
密切相關:http://stackoverflow.com/q/26037954/3425536 – emlai 2015-12-04 00:08:29