Sublime Text 中配置 C++ Build 实战

介绍

上一篇文章介绍了 Sublime Text 中 Build system 的基本配置语法和方法,给出的案例是单文件的,对于简单的程序完全够用,但是如果是一个较大的 C++ 项目呢?我们肯定会用到诸如 Makefile, CMake, ninja, Scons 等构建工具,这篇文章就介绍如何在 Sublime Text 中结合这些构建工具来配置我们的 Build System。

我们主要用 Makefile, CMake 和 Scons 三个构建工具的案例来进行实战操作:

1. 使用 Makefile

Makefile 是构建 C++ 项目最常见的工具之一。它允许你定义规则来编译多个文件,指定依赖关系,并自动化构建过程。

设置步骤:

  1. 在项目目录下创建一个 Makefile:

• 定义编译器(如 g++)、源文件、输出文件以及编译选项。

• 指定源文件与目标文件之间的依赖关系。

• 包括一个 clean 目标,用于清除生成的文件。

下面是一个简单的 Makefile 示例:

Makefile 复制代码
# 编译器及编译选项
CXX = g++
CXXFLAGS = -Wall -std=c++17

# 目录与文件
SRC_DIR = src
OBJ_DIR = obj
BIN_DIR = bin
TARGET = $(BIN_DIR)/my_project

# 获取 src 目录下的所有 .cpp 文件
SRC_FILES = $(wildcard $(SRC_DIR)/*.cpp)
OBJ_FILES = $(SRC_FILES:$(SRC_DIR)/%.cpp=$(OBJ_DIR)/%.o)

# 主目标
$(TARGET): $(OBJ_FILES)
	@mkdir -p $(BIN_DIR)
	$(CXX) $(CXXFLAGS) -o $@ $^

# 将源文件编译为目标文件
$(OBJ_DIR)/%.o: $(SRC_DIR)/%.cpp
	@mkdir -p $(OBJ_DIR)
	$(CXX) $(CXXFLAGS) -c -o $@ $<

# 清理目标文件和二进制文件
clean:
	rm -rf $(OBJ_DIR) $(BIN_DIR)
解释:

• SRC_FILES:收集 src 目录下的所有 .cpp 文件。

• OBJ_FILES:将 .cpp 文件转换为存储在 obj 目录中的 .o 文件。

• 主目标 $(TARGET):将所有的目标文件链接为最终的可执行文件。

• clean 目标:用于删除编译生成的文件。

如何与 Sublime Text 集成:

你可以创建一个 Sublime Text 构建系统,通过它运行 Makefile,创建一个如下所示的构建系统:

json 复制代码
{
    "shell_cmd": "make -C /path/to/project",
    "working_dir": "/path/to/project",
    "file_regex": "^(..[^:]*):([0-9]+):?([0-9]+)?:? (.*)$",
    "selector": "source.c++, source.makefile",
    
    "variants": [
        {
            "name": "Clean",
            "shell_cmd": "make clean -C /path/to/project"
        }
    ]
}

make -C /path/to/project 命令告诉 Sublime 在项目目录下运行 make。

Clean 允许你通过 Sublime 清理项目。

2. 使用 CMake

CMake 是一个广泛使用的跨平台构建系统生成工具。它通过 CMakeLists.txt 配置文件生成原生的构建文件(如 Makefile 或 Ninja 文件)。

设置步骤:

1. 在项目目录下创建 CMakeLists.txt 文件:
cmake 复制代码
cmake_minimum_required(VERSION 3.10)
project(MyProject)

set(CMAKE_CXX_STANDARD 17)

# 定义源文件
file(GLOB SOURCES "src/*.cpp")

# 添加可执行文件目标
add_executable(my_project ${SOURCES})
2. 构建项目:

设置好 CMakeLists.txt 后,你可以使用 CMake 生成 Makefile(或其他构建系统,如 Ninja):

bash 复制代码
mkdir build
cd build
cmake ..
make

如何与 Sublime Text 集成:

创建一个 Sublime Text 构建系统,来运行 CMake 命令:

json 复制代码
{
    "shell_cmd": "cmake --build build",
    "working_dir": "/path/to/project",
    "file_regex": "^(..[^:]*):([0-9]+):?([0-9]+)?:? (.*)$",
    "selector": "source.c++, source.cmake",

    "variants": [
        {
            "name": "Configure",
            "shell_cmd": "cmake -S . -B build"
        },
        {
            "name": "Clean",
            "shell_cmd": "rm -rf build"
        }
    ]
}

• Configure 变体生成 build 目录中的构建文件。

• 主构建命令使用生成的构建系统编译项目。

• Clean 变体删除 build 目录。

3. 使用 SCons

SCons 是一个更现代的构建工具,用 Python 编写,和 Makefile 相比,它提供了更大的灵活性和易用性。SCons 自动处理依赖追踪,构建配置通过 Python 脚本(SConstruct 文件)完成。

设置步骤:

1. 安装 SCons:
bash 复制代码
sudo apt install scons  # Linux
brew install scons      # macOS
2. 在项目根目录下创建 SConstruct 文件:
ini 复制代码
env = Environment()
sources = Glob('src/*.cpp')  # 获取 src 目录下的所有源文件
env.Program(target='bin/my_project', source=sources)
选择哪种方案?

• Makefile:适合传统设置和熟悉 Makefile 的开发者。它被广泛支持,适合简单到中等规模的项目。

• SCons:相比 Makefile 提供更多的灵活性和自动化,特别是基于 Python 的配置文件。

• CMake:适合跨平台项目,现代 C++ 项目中广泛使用。它与其他工具和 IDE 的集成也很好。

• Environment():创建一个构建环境。

• Glob('src/*.cpp'):收集 src 目录下的所有 .cpp 文件。

• Program:将这些文件编译并链接为 bin 目录中的可执行文件。

如何与 Sublime Text 集成:

在 Sublime 中创建一个构建系统,通过它运行 SCons:

json 复制代码
{
    "shell_cmd": "scons",
    "working_dir": "/path/to/project",
    "file_regex": "^(..[^:]*):([0-9]+):?([0-9]+)?:? (.*)$",
    "selector": "source.c++, source.scons",

    "variants": [
        {
            "name": "Clean",
            "shell_cmd": "scons -c"
        }
    ]
}

• scons 命令将运行 SCons 构建过程。

• Clean 变体使用 scons -c 来清理已编译的文件。

全文完!

如果你喜欢我的文章,欢迎关注我的微信公众号 deliverit。

相关推荐
xiaozhiwise30 分钟前
Makefile 之 自动化变量
linux
Yang.992 小时前
基于Windows系统用C++做一个点名工具
c++·windows·sql·visual studio code·sqlite3
熬夜学编程的小王2 小时前
【初阶数据结构篇】双向链表的实现(赋源码)
数据结构·c++·链表·双向链表
zz40_2 小时前
C++自己写类 和 运算符重载函数
c++
六月的翅膀2 小时前
C++:实例访问静态成员函数和类访问静态成员函数有什么区别
开发语言·c++
liujjjiyun2 小时前
小R的随机播放顺序
数据结构·c++·算法
¥ 多多¥3 小时前
c++中mystring运算符重载
开发语言·c++·算法
意疏3 小时前
【Linux 篇】Docker 的容器之海与镜像之岛:于 Linux 系统内探索容器化的奇妙航行
linux·docker
BLEACH-heiqiyihu3 小时前
RedHat7—Linux中kickstart自动安装脚本制作
linux·运维·服务器