SCons

SCons 是 Python 脚本式构建工具。你写 SConstruct,用 Python 表达如何编译程序、库和依赖。

适合想用脚本逻辑控制构建流程的项目;如果只是常规跨平台 C++ 项目,CMake 更常见。

核心概念

概念作用
SConstruct项目入口构建脚本
Environment编译器、参数、环境变量集合
Program构建可执行程序
Library构建静态库
SharedLibrary构建动态库
Depends显式补充依赖

最小 C++ 示例

目录结构:

hello-scons/
├── SConstruct
├── include/
│   └── hello.h
└── src/
    ├── hello.cpp
    └── main.cpp

include/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/app

Windows 下可能是:

build\app.exe

直接构建可执行文件

更小的写法:

env = Environment(
    CXX="g++",
    CXXFLAGS=["-std=c++17"],
)
 
env.Program(
    target="hello",
    source=["main.cpp"],
)

核心命令自查表

命令作用
scons执行默认构建
scons -c清理构建产物
scons -j44 线程并行构建
scons build/app构建指定目标
scons --tree=all查看依赖树
scons --debug=explain解释为什么重建

常见错误

现象原因处理
找不到 SConstruct不在项目根目录进入有 SConstruct 的目录
找不到头文件CPPPATH 没配置CPPPATH=["include"]
编译器不是想要的默认环境选错工具链Environment 里设置 CXX
清理不干净有文件不是 SCons 生成的确认产物由 ProgramLibrary 等创建

注意事项

  • SConstruct 是 Python,但不是随意执行 shell 命令的脚本;优先用 SCons 的 ProgramLibrary API。
  • SCons 会追踪依赖并做增量构建。
  • 团队协作时要控制脚本复杂度,避免构建逻辑变成难维护的 Python 程序。