在 CMake 中,install()
命令用于安裝構建的目標文件、頭文件、庫等到指定的目標路徑。install(FILES ...)
和 install(DIRECTORY ...)
都是 install()
命令的具體用法,它們的功能和適用場景不同。
以下是兩者的詳細區別和用法說明:
1. install(FILES ...)
功能
- 直接安裝指定的文件到目標路徑。
- 適用于安裝單個文件(如頭文件、配置文件等)。
語法
install(FILES file1 file2 ... DESTINATION target_directory [OPTIONAL_ARGUMENTS])
參數說明
FILES
: 需要安裝的文件列表。DESTINATION
: 安裝的目標路徑,相對于CMAKE_INSTALL_PREFIX
。- 可選參數:
PERMISSIONS
: 指定文件權限(如OWNER_READ
,OWNER_WRITE
等)。RENAME
: 重命名文件時使用。
示例
# 將頭文件安裝到目標 include 目錄
install(FILES header1.h header2.h DESTINATION include)# 將文件安裝到目標路徑并設置權限
install(FILES config.json DESTINATION etcPERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ
)
2. install(DIRECTORY ...)
功能
- 遞歸安裝整個目錄的內容到目標路徑。
- 適用于安裝文件夾及其子文件夾中的所有內容。
語法
install(DIRECTORY dir1 dir2 ... DESTINATION target_directory [OPTIONAL_ARGUMENTS])
參數說明
DIRECTORY
: 需要安裝的目錄列表。DESTINATION
: 安裝的目標路徑,相對于CMAKE_INSTALL_PREFIX
。- 可選參數:
FILES_MATCHING
: 只安裝符合指定模式的文件。PATTERN
和REGEX
: 用于過濾文件或目錄的匹配模式。EXCLUDE
: 排除匹配的文件或目錄。
示例
# 將目錄的內容遞歸安裝到目標路徑
install(DIRECTORY my_include/ DESTINATION include)# 只安裝特定擴展名的文件(如 .h 文件)
install(DIRECTORY my_include/ DESTINATION includeFILES_MATCHING PATTERN "*.h"
)# 排除特定目錄
install(DIRECTORY my_project/ DESTINATION projectPATTERN "build" EXCLUDE
)
主要區別
特性 | install(FILES) | install(DIRECTORY) |
---|---|---|
用途 | 安裝指定的單個或多個文件 | 安裝整個目錄及其內容 |
遞歸處理子目錄 | 不支持 | 支持遞歸安裝目錄及其子目錄 |
支持過濾和模式匹配 | 不支持 | 支持通過 PATTERN 或 REGEX 進行過濾 |
適用場景 | 安裝頭文件、配置文件、庫文件等 | 安裝包含多個文件或目錄的資源(如源碼、數據、文檔等) |
排除內容 | 不支持 | 支持使用 EXCLUDE 排除匹配的文件或目錄 |
使用建議
install(FILES)
: 當需要安裝少量的特定文件時使用。install(DIRECTORY)
: 當需要遞歸安裝整個目錄(如頭文件目錄、資源目錄)時使用,尤其是需要過濾或排除特定文件時。
示例:結合使用 FILES
和 DIRECTORY
# 將單個文件安裝到配置目錄
install(FILES config.json DESTINATION etc)# 將整個頭文件目錄安裝到目標 include 目錄
install(DIRECTORY my_include/ DESTINATION include)# 僅安裝特定文件類型(如 .h 和 .cpp 文件),排除子目錄中的文件
install(DIRECTORY my_src/ DESTINATION srcFILES_MATCHING PATTERN "*.h" PATTERN "*.cpp"PATTERN "tests" EXCLUDE
)
總結
- 使用
install(FILES)
直接安裝單個或多個文件,適合靜態文件或非遞歸安裝場景。 - 使用
install(DIRECTORY)
遞歸安裝整個目錄,適合安裝復雜的目錄結構或需要文件過濾的場景。