SCons
SCons 是 Python 脚本式构建工具。你写 SConstruct,用 Python 表达如何编译程序、库和依赖。
适合想用脚本逻辑控制构建流程的项目;如果只是常规跨平台 C++ 项目,CMake 更常见。
核心概念
| 概念 | 作用 |
|---|---|
SConstruct | 项目入口构建脚本 |
Environment | 编译器、参数、环境变量集合 |
Program | 构建可执行程序 |
Library | 构建静态库 |
SharedLibrary | 构建动态库 |
Depends | 显式补充依赖 |
最小 C++ 示例
目录结构:
hello-scons/
├── SConstruct
├── include/
│ └── hello.h
└── src/
├── hello.cpp
└── main.cppinclude/hello.h:
#pragma once
void say_hello();src/hello.cpp:
#include "hello.h"
#include <iostream>
void say_hello()
{
std::cout << "Hello SCons" << std::endl;
}src/main.cpp:
#include "hello.h"
int main()
{
say_hello();
return 0;
}SConstruct:
env = Environment(
CXX="g++",
CXXFLAGS=["-std=c++17", "-Wall", "-Wextra"],
CPPPATH=["include"],
)
hello_lib = env.Library(
target="build/hello",
source=["src/hello.cpp"],
)
env.Program(
target="build/app",
source=["src/main.cpp", hello_lib],
)构建:
scons运行:
./build/appWindows 下可能是:
build\app.exe直接构建可执行文件
更小的写法:
env = Environment(
CXX="g++",
CXXFLAGS=["-std=c++17"],
)
env.Program(
target="hello",
source=["main.cpp"],
)核心命令自查表
| 命令 | 作用 |
|---|---|
scons | 执行默认构建 |
scons -c | 清理构建产物 |
scons -j4 | 4 线程并行构建 |
scons build/app | 构建指定目标 |
scons --tree=all | 查看依赖树 |
scons --debug=explain | 解释为什么重建 |
常见错误
| 现象 | 原因 | 处理 |
|---|---|---|
找不到 SConstruct | 不在项目根目录 | 进入有 SConstruct 的目录 |
| 找不到头文件 | CPPPATH 没配置 | 加 CPPPATH=["include"] |
| 编译器不是想要的 | 默认环境选错工具链 | 在 Environment 里设置 CXX |
| 清理不干净 | 有文件不是 SCons 生成的 | 确认产物由 Program、Library 等创建 |
注意事项
SConstruct是 Python,但不是随意执行 shell 命令的脚本;优先用 SCons 的Program、LibraryAPI。- SCons 会追踪依赖并做增量构建。
- 团队协作时要控制脚本复杂度,避免构建逻辑变成难维护的 Python 程序。