如何调整CMakeLists.txt或编写bash脚本实现cmake指定输出目录编译
解决方案
优先修改CMakeLists.txt,搭配可选的runme.sh优化即可满足需求,同时从根源避免根目录生成编译垃圾文件。
第一步:修改CMakeLists.txt(必改)
在CMakeLists.txt最开头(project指令之前)添加如下代码:
# 禁止在项目根目录直接编译,避免生成垃圾文件 if(CMAKE_SOURCE_DIR STREQUAL CMAKE_BINARY_DIR) message(FATAL_ERROR "禁止在根目录直接执行cmake,请进入bin/下对应构建类型目录操作,或使用sh/runme.sh脚本编译。") endif() # 统一配置编译产物输出路径 set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
修改后如果有人误在根目录执行cmake .,会直接报错终止,不会生成任何CMake缓存、Makefile等冗余文件,完全保证根目录整洁。
第二步:优化runme.sh(可选,增强鲁棒性)
你原本的脚本逻辑基本正确,但可以优化参数校验、自动创建目录、动态适配构建类型,避免硬编码问题:
#!/bin/bash # 校验输入参数合法性 if [ $# -ne 1 ] || [[ ! "$1" =~ ^(Debug|Release)$ ]]; then echo "用法: sh sh/runme.sh <Debug|Release>" exit 1 fi # 自动创建构建目录,不存在也不会报错 BUILD_DIR="bin/$1" mkdir -p "$BUILD_DIR" cd "$BUILD_DIR" || exit 1 # 动态传入构建类型,并行编译提升速度 cmake -DCMAKE_BUILD_TYPE="$1" ../../ cmake --build . -j$(nproc)
改完后直接在根目录执行sh sh/runme.sh Debug就能完成和手动操作完全一致的编译流程,所有产物都存放在bin/Debug目录下。
内容的提问来源于stack exchange,提问作者Dr.PB
相关产品推荐
相关产品推荐

