install()命令需显式调用,头文件安装应使用install(directory include/mylib destination include),库文件须按类型指定archive/library/interface参数,且必须配合install(export)和configure_package_config_file生成正确config.cmake才能支持find_package。

install() 命令怎么写才真正把头文件拷过去
默认 add_library() 或 add_executable() 不会自动安装任何文件,必须显式调用 install()。头文件安装的关键是用 install(DIRECTORY ...) 或 install(FILES ...),且路径必须指向源码树里的实际位置(不是构建目录)。
- 如果头文件在
include/mylib/下,用install(DIRECTORY include/mylib DESTINATION include)—— 注意DESTINATION是安装根目录下的相对路径,最终会到${CMAKE_INSTALL_PREFIX}/include/mylib/ - 别用
install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/include/*.h ...):通配符在 CMake 配置阶段不展开,会报错或静默失败 - 若头文件分散在多处,优先用
DIRECTORY+FILES_MATCHING PATTERN "*.h",比逐个列FILES更可靠
如何让 install() 正确处理库文件(静态/动态/接口库)
库的安装行为取决于库类型和 install(TARGETS ...) 的参数组合,光写 install(TARGETS mylib) 很可能只装了动态库(.so/.dll),漏掉 .a 或不设权限。
- 对静态库
mylib:必须加ARCHIVE DESTINATION lib,否则默认不安装(ARCHIVE指 .a/.lib) - 对动态库:用
LIBRARY DESTINATION lib;若需在 macOS 上设置 rpath,得额外加LIBRARY DESTINATION lib NAMELINK_ONLY配合INSTALL_NAME_DIR - 接口库(
INTERFACE类型)不能直接 install,要通过install(EXPORT ...)导出依赖信息,否则下游 find_package 找不到头文件路径
find_package() 能找到你的库吗?关键看 export() 和 config 文件
装完文件只是第一步,用户执行 find_package(MyLib) 能否成功,取决于你有没有生成并安装正确的 MyLibConfig.cmake。
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
- 必须先用
install(EXPORT mylibTargets ...)把 target 导出到一个.cmake文件(如mylibTargets.cmake) - 再用
configure_package_config_file()生成MyLibConfig.cmake,里面要包含set_and_check(MYLIB_INCLUDE_DIRS "${CMAKE_CURRENT_LIST_DIR}/../../../include")这类路径修正逻辑 - 漏掉
write_basic_package_version_file()就会导致find_package(MyLib 1.2 REQUIRED)失败,版本校验直接跳过
make install 时提示 “Permission denied” 或文件没更新
常见于反复 install 同一路径,尤其在系统目录(如 /usr/local)下没加 sudo,或旧文件被占用导致覆盖失败。
- 开发调试阶段强烈建议用本地前缀:
cmake -DCMAKE_INSTALL_PREFIX=$HOME/myinstall .. && make install,避免权限和污染系统 - 修改了
install()后重新 install,CMake 不会自动重运行 configure 步骤,得删掉 build 目录重建,或手动 touch 一个CMakeLists.txt强制检测变更 - Windows 上若用 Ninja + Visual Studio 工具链,
install目标可能不可见,得用cmake --build . --target install显式调用
最易被忽略的是 export 与 config 文件的路径拼接逻辑——哪怕所有文件都拷对了位置,只要 MyLibConfig.cmake 里写的头文件路径相对于它自身位置算错了,find_package() 就会静默失败,连 warning 都不给。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










