You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何调整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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 14:27:02