CMake 中的 PUBLIC,PRIVATE,INTERFACE
生活随笔
收集整理的這篇文章主要介紹了
CMake 中的 PUBLIC,PRIVATE,INTERFACE
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一、概述
CMake中經常會使用?target_**()?相關命令,target_**()?命令支持通過?PUBLIC,PRIVATE?和?INTERFACE?關鍵字來控制傳播。本文主要介紹下這三個關鍵字的區別。
二、解釋
以?target_link_libraries(A B)?命令為例,從理解的角度解釋:
- PRIVATE 依賴項 B 僅鏈接到目標 A,若有 C 鏈接了目標 A,C 不鏈接依賴項 B 。
- INTERFACE 依賴項 B 并不鏈接到目標 A,若有 C 鏈接了目標 A,C 會鏈接依賴項 B 。
- PUBLIC 依賴項 B 鏈接到目標 A,若有 C 鏈接了目標 A,C 也會鏈接依賴項 B 。
從使用的角度解釋,若有 C 鏈接了目標 A :
- 如果依賴項 B 僅用于目標 A 的實現,且不在頭文件中提供給 C 使用,使用 PRIVATE 。
- 如果依賴項 B 不用于目標 A 的實現,僅在頭文件中作為接口提供給 C 使用,使用 INTERFACE 。
- 如果依賴項 B 不僅用于目標 A 的實現,而且在頭文件提供給 C 使用,使用 PUBLIC 。
例 子
舉一個簡單的例子說明一下
add_library(C c.cpp) add_library(D d.cpp)add_library(B b.cpp) target_link_libraries(B PUBLIC C) target_link_libraries(B PRIVATE D)add_executable(A a.cpp) target_link_libraries(A B)因為 C 是 B 的 PUBLIC 依賴項,所以其會被傳播到 A 。
因為 D 是 B 的 PRIVATE 依賴項,所以其不會傳播到 A 。
三、補充
這里補充下使用?target_**()相關命令,有無?target?的區別。
以?target_include_directories()?命令為例,include_directories(dir)?是一個全局設置,其會將?dir?添加到當前 CMakeLists 文件中每個目標的?INCLUDE_DIRECTORIES?屬性中。即當前 CMakeLists 文件其下所有的子目錄都會添加 dir 目錄。
因此,建議使用有?target?的命令來減少不必要或多余的目錄包含和鏈接。
轉載:CMake 中的 PUBLIC,PRIVATE,INTERFACE - 簡書
(SAW:Game Over!)
總結
以上是生活随笔為你收集整理的CMake 中的 PUBLIC,PRIVATE,INTERFACE的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 什么是 Linux 安全基线?
- 下一篇: cmake / CMAKE _ * _