install规则需显式触发,必须指定目标类型(archive/library/runtime)和destination路径,依赖cmake_install_prefix确定根目录,files/directory需注意权限与过滤,clion中安装不自动构建且不等价于make install。

install 规则不是“写完就生效”的,它必须显式触发(比如执行 make install 或 CLion 的“构建 | 安装”),而且路径、目标类型、安装时机都容易出错——不配 CMAKE_INSTALL_PREFIX,DESTINATION 用相对路径时会落到奇怪位置;漏写 LIBRARY 或 RUNTIME,动态库和可执行文件就只装一半。
install(TARGETS ...) 必须指定目标类型和安装位置
只写 install(TARGETS mylib) 不会自动装到 lib/ 或 bin/,CMake 不猜你意图。必须明确告诉它“这是动态库还是可执行文件”,以及“想放哪儿”:
-
ARCHIVE对应静态库(.a/.lib),通常配DESTINATION lib -
LIBRARY对应动态库(.so/.dylib/.dll),也常配DESTINATION lib -
RUNTIME对应可执行文件(.exe/ 无后缀二进制),应配DESTINATION bin - Windows 下
.dll既要LIBRARY(开发时链接用),也要RUNTIME(运行时加载用),否则安装后程序找不到 DLL
示例:
install(TARGETS myapp RUNTIME DESTINATION bin BUNDLE DESTINATION . LIBRARY DESTINATION lib ARCHIVE DESTINATION lib/static)
CMAKE_INSTALL_PREFIX 决定所有相对 DESTINATION 的根目录
DESTINATION 路径是相对于 CMAKE_INSTALL_PREFIX 的,不是当前目录或 build 目录。没设它,默认值通常是 /usr/local(Linux/macOS)或 C:/Program Files/${PROJECT_NAME}(Windows),普通用户没权限写入。
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
- 命令行配置:
cmake -DCMAKE_INSTALL_PREFIX=/opt/mypkg .. - CLion 中:Settings → Build, Execution, Deployment → CMake → CMake options,填
-DCMAKE_INSTALL_PREFIX=/home/user/install - 在
CMakeLists.txt里硬编码set(CMAKE_INSTALL_PREFIX ...)不推荐——会覆盖用户传入的值
如果 DESTINATION 写了绝对路径(如 /opt/myapp/bin),则 CMAKE_INSTALL_PREFIX 被忽略,但这种写法破坏可移植性,CI 和多用户环境会出问题。
install(FILES ...) 和 install(DIRECTORY ...) 容易漏掉权限或覆写
装配置文件、头文件、资源目录时,FILES 和 DIRECTORY 行为差异大,且默认不带执行权限:
-
install(FILES config.h DESTINATION include)—— 只拷一个文件,不递归 -
install(DIRECTORY assets/ DESTINATION share/myapp FILES_MATCHING PATTERN "*.png")—— 要加FILES_MATCHING才能过滤,否则整个目录(含子目录)全拷 - 脚本文件(如
tools/deploy.sh)需显式加PERMISSIONS OWNER_EXECUTE GROUP_EXECUTE WORLD_EXECUTE,否则装过去不可执行 - 用
REGULAR_EXPRESSION过滤时注意正则语法是 CMake 风格(非 PCRE),.*\.h$才匹配 .h 结尾,*.h是 shell glob,不生效
CLion 里“安装”操作不自动构建,也不等价于 make install
CLion 的 构建 | 安装 看起来像一键到位,但它实际行为取决于 CMake 配置:
- 如果没在
CMakeLists.txt里写任何install(...),点“安装”会报错:no install target - 它默认调用的是
cmake --build . --target install,不是make install,所以依赖 Ninja/MSBuild 的 target 机制,不是 Makefile 规则 - 若启用了“启动前运行安装”,务必手动去掉“构建”步骤,否则目标被构建两次(一次为 build,一次为 install),浪费时间还可能因并发导致中间文件冲突
- 需要 root 权限时(比如装到
/usr),CLion 默认不提权,得改用 Terminal 手动跑sudo cmake --build . --target install
最常被忽略的一点:install 规则本身不参与构建依赖图——即使你 install(TARGETS foo),但 foo 没被其他 target 依赖,它可能根本不会被构建,install 就只是个空操作。确保目标至少被 add_executable/add_library 正确定义,并在必要时用 add_dependencies 显式关联。










