CMake 中 install 的使用原因和使用方法
一、为什么要使用 install?
在 CMake 中,install 命令的作用是定义项目在安装(部署)时应该安装哪些文件、以及安装到哪里。
平时用 cmake + make 编译后,生成的文件默认存在构建目录中,比如 build/,但这还不是真正意义上的“安装”——如果你要把这个程序交付给用户,或者在系统中注册可执行文件、库、头文件等,你就需要使用 CMake 的 install 命令。
主要原因:
-
统一部署流程
无论是 Linux、Windows 还是 macOS,install都能以跨平台的方式定义安装规则。 -
安装到标准系统目录
例如:- 可执行文件:
/usr/local/bin - 库文件:
/usr/local/lib - 头文件:
/usr/local/include
这些路径可以由用户通过CMAKE_INSTALL_PREFIX自定义。
- 可执行文件:
-
配合打包工具
install规则可以直接被cpack等工具使用,生成.deb,.rpm,.zip,.tar.gz等分发包。 -
多组件安装支持
你可以指定不同的安装组件,方便用户选择安装哪些部分(比如只安装可执行文件,不安装开发头文件)。
二、install 的基本用法
在 CMakeLists.txt 中定义 install 规则的常见形式如下:
1. 安装可执行文件 / 库
add_executable(myapp main.cpp)
install(TARGETS myappRUNTIME DESTINATION bin # 可执行文件安装目录
)
对于库:
add_library(mylib SHARED lib.cpp)
install(TARGETS mylibLIBRARY DESTINATION lib # 共享库安装目录ARCHIVE DESTINATION lib # 静态库安装目录
)
2. 安装头文件或普通文件
install(FILES myheader.hDESTINATION include
)
3. 安装整个目录
install(DIRECTORY src/include/DESTINATION includeFILES_MATCHING PATTERN "*.h"
)
三、安装位置控制
安装的位置由变量 CMAKE_INSTALL_PREFIX 控制,默认在 Linux/Unix 为 /usr/local,在 Windows 通常是 C:/Program Files/项目名。
例如:
cmake -DCMAKE_INSTALL_PREFIX=/opt/myproject ..
make
make install
这样文件会安装到:
/opt/myproject/bin
/opt/myproject/lib
/opt/myproject/include
四、安装组件(可选)
你可以为不同的安装内容指定组件,这样用户可以选择只安装某个组件:
install(TARGETS myappRUNTIME DESTINATION binCOMPONENT runtime
)install(FILES myheader.hDESTINATION includeCOMPONENT devel
)
在安装时可以:
make install COMPONENT=runtime
五、常见完整示例
假设我们有一个简单工程:
project/
│── src/main.cpp
│── src/lib.cpp
│── include/lib.h
│── CMakeLists.txt
CMakeLists.txt:
cmake_minimum_required(VERSION 3.10)
project(MyProject)add_library(mylib src/lib.cpp)
add_executable(myapp src/main.cpp)
target_link_libraries(myapp PRIVATE mylib)# 安装库
install(TARGETS mylibLIBRARY DESTINATION libARCHIVE DESTINATION lib
)# 安装可执行文件
install(TARGETS myappRUNTIME DESTINATION bin
)# 安装头文件
install(FILES include/lib.hDESTINATION include
)
构建 & 安装:
mkdir build && cd build
cmake ..
make
sudo make install
效果:
/usr/local/bin/myapp
/usr/local/lib/libmylib.so
/usr/local/include/lib.h
六、总结
使用原因:
- 将编译产物部署到标准目录
- 跨平台安装文件
- 与打包工具集成
- 支持模块化安装
使用方法:
install(TARGETS ...)安装目标文件(可执行、库等)install(FILES ...)安装特定文件install(DIRECTORY ...)安装目录- 通过
CMAKE_INSTALL_PREFIX控制安装位置 - 使用
COMPONENT灵活选择安装部分
