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。

相关推荐
xuanzdhc13 分钟前
Linux 基础IO
linux·运维·服务器
愚润求学19 分钟前
【Linux】网络基础
linux·运维·网络
bantinghy1 小时前
Linux进程单例模式运行
linux·服务器·单例模式
小和尚同志2 小时前
29.4k!使用 1Panel 来管理你的服务器吧
linux·运维
帽儿山的枪手2 小时前
为什么Linux需要3种NAT地址转换?一探究竟
linux·网络协议·安全
shadon1789 天前
回答 如何通过inode client的SSLVPN登录之后,访问需要通过域名才能打开的服务
linux
小米里的大麦9 天前
014 Linux 2.6内核进程调度队列(了解)
linux·运维·驱动开发
LyaJpunov9 天前
深入理解 C++ volatile 与 atomic:五大用法解析 + 六大高频考点
c++·面试·volatile·atomic
小灰灰搞电子9 天前
Qt PyQt与PySide技术-C++库的Python绑定
c++·qt·pyqt
算法练习生9 天前
Linux文件元信息完全指南:权限、链接与时间属性
linux·运维·服务器