CMake 中 build 目录和 install 目录必须分开指定:build 目录由 cmake 命令执行路径决定(如 -B build),存放编译中间产物;install 目录由 CMAKE_INSTALL_PREFIX 控制,install() 的 DESTINATION 为其子路径,两者不可混用。

build 目录和 install 目录必须分开指定
CMake 默认把编译产物(如 .o、.a、.so)和最终可执行文件/库都放在 build 目录里,但你不能靠 set(CMAKE_BINARY_DIR ...) 或 set(CMAKE_CURRENT_BINARY_DIR ...) 来“修改输出位置”——这些变量是只读的,手动赋值无效。真正可控的是两个独立路径:build 目录(CMake 运行时所在目录)和 install 目录(安装目标路径)。
-
build目录由你执行cmake命令时的当前工作目录决定,例如mkdir build && cd build && cmake ..,所有中间文件就落在build/下 -
install目录由CMAKE_INSTALL_PREFIX控制,它影响make install或cmake --install的目标位置,默认通常是/usr/local - 想让可执行文件统一输出到某个子目录(比如
bin/),要用set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin),而不是改CMAKE_BINARY_DIR
CMAKE_RUNTIME_OUTPUT_DIRECTORY 等输出变量要提前设置
这些变量必须在 project() 之后、add_executable() 之前设置,否则对已定义的目标不生效。它们不是全局覆盖,而是影响后续新添加的目标。
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
-
CMAKE_RUNTIME_OUTPUT_DIRECTORY:控制add_executable()生成的可执行文件路径 -
CMAKE_LIBRARY_OUTPUT_DIRECTORY:控制add_library(SHARED)输出的.so/.dll -
CMAKE_ARCHIVE_OUTPUT_DIRECTORY:控制add_library(STATIC)输出的.a/.lib - 它们的值可以是绝对路径,但更推荐用相对路径(如
${CMAKE_BINARY_DIR}/bin),避免跨平台问题
install() 指令里的 DESTINATION 是相对于 CMAKE_INSTALL_PREFIX 的
即使你用 CMAKE_RUNTIME_OUTPUT_DIRECTORY 把可执行文件输出到了 build/bin/,install() 仍按自己的规则复制。它的 DESTINATION 参数不是绝对路径,而是拼接到 CMAKE_INSTALL_PREFIX 后面的子路径。
-
install(TARGETS myapp DESTINATION bin)→ 最终装到${CMAKE_INSTALL_PREFIX}/bin/myapp -
cmake -DCMAKE_INSTALL_PREFIX=/opt/mypkg ..后,make install就会把文件放进/opt/mypkg/bin/ - 如果没写
install(),那CMAKE_INSTALL_PREFIX完全不起作用;光设变量不调用install()是没意义的
Windows 下 DLL 的输出和运行时查找容易出错
在 Windows 上,.exe 运行时需要找到对应的 .dll,但 CMake 默认不会自动把 DLL 复制到 EXE 同目录,也不会改 PATH。这是最常被忽略的环节。
- 用
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)和set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)把 EXE 和 DLL 都输出到同一目录,是最简单可靠的方案 - 或者用
install(FILES $<TARGET_FILE:mylib> DESTINATION bin)显式把 DLL 装进bin/,再配合install(TARGETS myapp RUNTIME DESTINATION bin) - 不要依赖
add_compile_definitions(_CRT_SECURE_NO_WARNINGS)之类去绕过 DLL 加载失败——那是掩盖问题,不是解决路径问题

















