配置CMake:如何将非二进制服务文件移至build目录子文件夹?
实现CMake构建文件的目录整理
CMake本身并没有原生支持将所有生成的服务文件直接移到子目录的选项,但可以通过以下几种方式实现你想要的目录结构:
方法1:使用二次构建(推荐)
核心思路是把CMake的实际构建目录设为build/.cmake,然后将二进制文件输出到上层的build目录:
- 先创建
build/.cmake目录(如果不存在) - 在项目根目录执行:
这里的cmake -S . -B build/.cmake -DCMAKE_ARCHIVE_OUTPUT_DIRECTORY=../CMAKE_ARCHIVE_OUTPUT_DIRECTORY指定静态库(比如project.a)的输出路径为build目录(相对于build/.cmake的上层)。如果是可执行文件,还需要设置CMAKE_RUNTIME_OUTPUT_DIRECTORY=../;动态库则用CMAKE_LIBRARY_OUTPUT_DIRECTORY=../。 - 构建时直接指向实际构建目录:
cmake --build build/.cmake
这种方式下,所有CMake生成的服务文件(CMakeFiles、Makefile、CMakeCache.txt等)都会存在build/.cmake里,而最终的二进制文件会输出到build目录,完全符合你期望的结构。
方法2:构建后自动移动文件
如果不想改变构建目录的指定方式,可以在CMakeLists.txt中添加构建后指令,将生成的服务文件移动到build/.cmake:
在项目根目录的CMakeLists.txt末尾添加:
# 构建完成后整理文件 add_custom_command( TARGET project.a POST_BUILD COMMAND ${CMAKE_COMMAND} -E make_directory ${PROJECT_BINARY_DIR}/.cmake COMMAND ${CMAKE_COMMAND} -E rename ${PROJECT_BINARY_DIR}/CMakeFiles ${PROJECT_BINARY_DIR}/.cmake/CMakeFiles COMMAND ${CMAKE_COMMAND} -E rename ${PROJECT_BINARY_DIR}/Makefile ${PROJECT_BINARY_DIR}/.cmake/Makefile COMMAND ${CMAKE_COMMAND} -E rename ${PROJECT_BINARY_DIR}/cmake_install.cmake ${PROJECT_BINARY_DIR}/.cmake/cmake_install.cmake COMMAND ${CMAKE_COMMAND} -E rename ${PROJECT_BINARY_DIR}/CMakeCache.txt ${PROJECT_BINARY_DIR}/.cmake/CMakeCache.txt COMMAND ${CMAKE_COMMAND} -E rename ${PROJECT_BINARY_DIR}/compile_commands.json ${PROJECT_BINARY_DIR}/.cmake/compile_commands.json COMMENT "Moving CMake service files to build/.cmake" )
注意这种方式的局限性:
- 需要手动列举所有要移动的文件/目录,若CMake生成新的文件可能需要更新指令
- 部分IDE或工具可能依赖这些文件的原始位置,可能出现兼容性问题
- 重新构建时可能会重复生成文件在原位置,需要确保移动操作的幂等性
额外说明
- 关于
compile_commands.json:可以通过设置CMAKE_EXPORT_COMPILE_COMMANDS=ON来生成,在方法1中,这个文件会生成在build/.cmake里,如果你需要让工具能找到它,可以在项目根目录创建软链接:ln -s build/.cmake/compile_commands.json ./ - 方法1是最稳定的方式,因为它完全遵循CMake的构建逻辑,只是调整了构建根目录和输出路径,不会有兼容性问题。
内容的提问来源于stack exchange,提问作者ilia
相关产品推荐
相关产品推荐

