在日常 C/C++ 开发中,频繁手动配置构建命令既繁琐又容易出错。本文将介绍如何结合 CMake 和 Shell 脚本,搭建一个轻量级的自动构建环境,支持递归编译多个 .c
/ .cpp
文件,提升开发效率。
🧱 项目结构
我们的项目组织形式如下:
project-root/
├── src/
│ ├── main.c
│ └── utils/helper.cpp
├── build/ # 构建目录
└── setup.sh # 初始化脚本
🛠️ 自动构建脚本(setup.sh)
我们通过一个 setup.sh
脚本来自动完成以下任务:
- 检查当前目录及子目录是否包含 C/C++ 源文件;
- 自动创建
build/
目录; - 生成
CMakeLists.txt
; - 生成
run
构建脚本并执行。
#!/bin/bash
# 获取当前目录
CURRENT_DIR=$(pwd)
# 递归检查是否有 .c / .cpp 文件
if ! find . -type f \( -name "*.c" -o -name "*.cpp" \) | grep -q .; then
echo "No C/C++ source files found in this directory or subdirectories."
exit 1
fi
# 构建目录
BUILD_DIR="$CURRENT_DIR/build"
mkdir -p "$BUILD_DIR"
# 生成 CMakeLists.txt
cat > "$BUILD_DIR/CMakeLists.txt" <<EOF
cmake_minimum_required (VERSION 3.0)
project (demo0)
file(GLOB_RECURSE SRC_LIST ../*.c ../*.cpp)
# 排除 CMake 中间文件
foreach(FILE \${SRC_LIST})
string(FIND \${FILE} "CMakeFiles" FOUND)
if(NOT \${FOUND} EQUAL -1)
list(REMOVE_ITEM SRC_LIST \${FILE})
endif()
endforeach()
add_executable(main \${SRC_LIST})
EOF
# 生成构建脚本
cat > "$BUILD_DIR/build.sh" <<EOF
#!/bin/bash
cd "\$(dirname "\$0")" || exit 1
cmake .
make
if [ -f "./main" ]; then
echo "Compile SUCCESSFULLY, EXECUTING..."
./main
else
echo "FAIL"
fi
EOF
# 可执行权限
chmod +x "$BUILD_DIR/build.sh"
echo "Build setup complete."
# 执行构建
./build/build.sh
🔧 配置环境变量
为方便长期使用,可以将该脚本所在路径加入环境变量:
将脚本文件放入指定目录如:
$ ls ~/scripts/
run
配置环境变量:
sudo echo 'export PATH=$PATH:~/scripts' >> ~/.bashrc
这样你只需在项目目录下运行:
run
即可完成编译和执行。