Featured image of post Windows 绿色版开发工具链:CMake、MinGW、Maven、Gradle、nvm、ffmpeg、sqlite3 与 protoc 全配置

Windows 绿色版开发工具链:CMake、MinGW、Maven、Gradle、nvm、ffmpeg、sqlite3 与 protoc 全配置

程序员在 Windows 上不装 VS、不装 Visual Studio Build Tools 也能写 C/C++、打 jar、跑 Gradle、装多版本 Node、压视频、转 sqlite、编 protobuf——一份"解压即用"的工具集配置手册

一、为什么要在 Windows 上做"绿色版"开发工具链

每台新机器、每个新客户现场、每个虚拟机都要重新装一遍开发环境,是 Windows 程序员最痛苦的事之一。理想状态是:一个 D:\portable\ 目录,拷过去就能干活

本文把开发时最常用的小工具(不包含 IDE 与 Docker)整理成一份"解压即用"配置手册:

  • C/C++ 编译:CMake + MinGW
  • JVM 构建:Maven + Gradle
  • Node 多版本:nvm-windows
  • 多媒体处理:ffmpeg
  • 嵌入式数据库:sqlite3
  • IDL 编译:protoc
  • 搜索引擎:Elasticsearch(本地开发用)

二、C/C++ 工具链:CMake + MinGW

2.1 MinGW-w64 下载与配置

推荐 niXman/mingw-builds-binaries,选 x86_64-13.x.x-release-posix-seh-ucrt-rt_v11-rev0.7z(ucrt 是 Win10/11 推荐运行时)。

或者从 winlibs.com 下整合好的 zip。

解压到 D:\portable\dev\mingw64,加到 PATH:

1
PATH=D:\portable\dev\mingw64\bin

验证:

1
2
3
4
5
6
gcc --version
# gcc.exe (MinGW-W64) 13.2.0

# 把 mingw32-make.exe 复制一份改名 make
cp D:\portable\dev\mingw64\bin\mingw32-make.exe D:\portable\dev\mingw64\bin\make.exe
make --version

2.2 CMake 下载与配置

cmake.org/download 下载 cmake-3.x.x-windows-x86_64.zip,解压到 D:\portable\dev\cmake-3.28.3-windows-x86_64\bin 加 PATH。

1
2
cmake --version
# cmake version 3.28.3

避坑:下载页有两个版本 *-windows-x86_64.msi(安装器)和 *-windows-x86_64.zip(绿色版),选 zip 才能 portable。

2.3 完整编译一个 hello.cpp

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
cmd /c cd. > hello.cpp

# 写代码(用 vim 或记事本)
cat > hello.cpp <<EOF
#include <iostream>
int main() {
    std::cout << "Hello, World!" << std::endl;
    return 0;
}
EOF

# 编译
g++ -c hello.cpp
g++ hello.o -o hello.exe
./hello.exe

2.4 用 CMake 跨平台构建

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
cmd /c cd. > CMakeLists.txt

cat > CMakeLists.txt <<EOF
cmake_minimum_required(VERSION 3.0)
project(hello)
add_executable(hello hello.cpp)
if(WIN32)
    set(CMAKE_CXX_FLAGS "-static-libgcc -static-libstdc++")
endif()
EOF

mkdir build && cd build
cmake -G "Unix Makefiles" ../
make
./hello.exe

-static-libgcc -static-libstdc++ 关键!不写这两个就依赖 libgcc_s_seh-1.dll 等动态库,绿色拷贝出去会缺 DLL。

2.5 32 位与 64 位交叉编译

1
2
g++ -m32 hello.cpp -o hello32.exe
g++ -m64 hello.cpp -o hello64.exe

三、JVM 构建:Maven 与 Gradle

3.1 Maven 3.9

maven.apache.org 下载 apache-maven-3.9.4-bin.zip,解压到 D:\portable\dev\apache-maven-3.9.4

环境变量:

1
2
MAVEN_HOME=D:\portable\dev\apache-maven-3.9.4
PATH=%PATH%;%MAVEN_HOME%\bin

注:%MAVEN_HOME% 这种写法在 PowerShell 里要用 $env:MAVEN_HOME,cmd 才是 %...%

%MAVEN_HOME%\conf\settings.xml 必改项:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
<!-- 1. 镜像(公司 Nexus / 阿里云) -->
<mirrors>
  <mirror>
    <id>internal-nexus</id>
    <mirrorOf>central</mirrorOf>
    <url>http://internal.example.com:8081/repository/maven-public/</url>
  </mirror>
</mirrors>

<!-- 2. 本地仓库放 D 盘 -->
<localRepository>D:\portable\dev\.m2\repository</localRepository>

3.2 Maven 找不到插件 spring-boot-maven-plugin 的坑

pom.xml 里只声明 <plugin> 不带 <version>,会报:

1
[ERROR] Plugin 'org.springframework.boot:spring-boot-maven-plugin:' not found

原因:<pluginManagement> 里引用时未指定版本,或继承的 spring-boot-starter-parent 缺失。修法:

1
2
3
4
5
6
7
8
9
<build>
  <plugins>
    <plugin>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-maven-plugin</artifactId>
      <version>2.3.0.RELEASE</version>   <!-- 显式版本 -->
    </plugin>
  </plugins>
</build>

3.3 Gradle 8.x

gradle.org/releasesgradle-8.5-bin.zip,解压到 D:\portable\dev\gradle-8.5

1
PATH=D:\portable\dev\gradle-8.5\bin

3.4 引入本地第三方 jar(Maven 实战)

业务 jar 不在公共仓库时,不能用 mvn install,得在 common 模块的 pom.xml 里加 scope=system

1
2
3
4
5
6
7
<dependency>
  <groupId>com.example</groupId>
  <artifactId>thirdparty-jar</artifactId>
  <version>1.0.0</version>
  <scope>system</scope>
  <systemPath>${project.basedir}/src/main/resources/lib/thirdparty.jar</systemPath>
</dependency>

文件布局:

1
2
3
common/
├── src/main/resources/lib/thirdparty.jar
├── pom.xml

这种方式是反模式(jar 进 git),Maven 官方不推荐;正路是搭 Nexus / 阿里云 Maven 仓库。实在没私有仓库时,临时用。

四、Node 多版本:nvm-windows

4.1 下载

coreybutler/nvm-windows/releases 下载 nvm-noinstall.zip,解压到 D:\portable\dev\nvm

settings.txt 配置镜像(阿里云):

1
2
3
4
root: D:\portable\dev\nvm
path: D:\portable\dev\nodejs
node_mirror: https://npmmirror.com/mirrors/node/
npm_mirror: https://npmmirror.com/mirrors/npm/

4.2 常用命令

1
2
3
4
5
nvm install 18.20.0     # 装 Node 18 LTS
nvm install 20.11.0     # 装 Node 20 LTS
nvm use 18.20.0         # 切换到 18
nvm list                # 已装版本
nvm alias default 20.11.0

五、ffmpeg:音视频处理

5.1 下载

ffmpeg.orggyan.devBtbN 提供的构建包,下载 ffmpeg-release-essentials.zip,解压到 D:\portable\dev\ffmpeg,把 bin 加 PATH:

1
ffmpeg -version

5.2 YouTube 1080p Adaptive 音视频合并

YouTube-DL 抓下来的 1080p 视频是音视频分离的(一个 .mp4、一个 .webm),合成:

1
ffmpeg -i input.mp4 -i input.webm -strict -2 -acodec copy -vcodec copy output.mp4
  • -strict -2:启用实验性 AAC 编码(合成 1080p 必须);
  • -acodec copy / -vcodec copy:流复制,秒级完成。

5.3 截图、剪切、转码

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 截取第 5 秒的帧
ffmpeg -i input.mp4 -ss 5 -vframes 1 cover.jpg

# 裁剪 1080p → 480p
ffmpeg -i input.mp4 -vf scale=854:480 output_480p.mp4

# 剪切 00:30 - 01:30
ffmpeg -i input.mp4 -ss 00:00:30 -to 00:01:30 -c copy clip.mp4

# 视频转 GIF
ffmpeg -i input.mp4 -vf "fps=15,scale=480:-1" out.gif

六、sqlite3:嵌入式数据库

6.1 下载

sqlite.org/download.html 拉两个 zip:

  • sqlite-dll-win64-x64-3410200.zip:sqlite3.dll
  • sqlite-tools-win32-x86-3410200.zip:命令行工具

解压到 D:\portable\dev\sqlite3,把 sqlite3.exe 加 PATH。

6.2 基础使用

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# 打开/创建 db
sqlite> .open test.db

# 常用元命令
.databases          # 列出所有 db
.tables             # 列出所有表
.schema user        # 查看 user 表 DDL
.headers on
.mode column

# 退出
.exit

6.3 用 Navicat / IDEA 连接

sqlite3 本身支持 TCP 监听,但用 Navicat / IDEA 直连 .db 文件更直接:

1
2
3
4
5
6
# Navicat
连接类型:SQLite
数据库文件:D:\path\to\test.db

# IDEA Database 工具
Data Sources → SQLite → 选择 .db 文件

实战经验:很多"配置文件中心"工具(如 H2、HSQLDB、Apache Geode)底层都支持 sqlite 协议;本地开发、单元测试时 sqlite 比 MySQL 快 10 倍。

七、protoc:protobuf 编译

7.1 下载

protocolbuffers/protobuf/releases 下载 protoc-21.3-win64.zip(21.x 是 proto3 稳定版),解压到 D:\portable\dev\protoc-21.3\bin,加 PATH。

7.2 编译 .proto

1
2
3
protoc --java_out=./src/main/java -I. user.proto
protoc --go_out=./pkg -I. user.proto
protoc --python_out=. -I. user.proto
  • -I(或 --proto_path):proto 文件搜索目录
  • --xxx_out:目标语言输出目录

7.3 gRPC 代码生成

protoc 默认不生成 gRPC 服务端 / 客户端 stub,需要装 plugin:

1
2
3
4
5
# Java
protoc --java_out=. --grpc-java_out=. -I. user.proto

# Go
protoc --go_out=. --go-grpc_out=. -I. user.proto

详见 grpc/grpc-java / grpc/grpc-go 文档。

八、Elasticsearch:本地开发用

8.1 下载

elastic.co/downloads/past-releases 选 7.17.x 或 8.x 的 Windows zip(不推荐用 msi)。

1
D:\portable\dev\elasticsearch-8.11.0\bin\elasticsearch.bat

8.2 配置文件

config/elasticsearch.yml 关键项:

1
2
3
4
5
6
cluster.name: dev-cluster
node.name: dev-node-1
network.host: 127.0.0.1
http.port: 9200
discovery.type: single-node      # 单节点模式,省去选举
xpack.security.enabled: false    # 本地开发关掉安全

8.3 启动

1
2
3
4
5
# 不能用 root(Windows 默认 Administrator 即可)
bin\elasticsearch.bat

# 验证
curl http://127.0.0.1:9200

8.4 Head 插件

elasticsearch-head 是个 Chrome 插件 + 老式 Node 项目,可视化查看 index:

1
2
3
4
5
git clone https://github.com/mobz/elasticsearch-head
cd elasticsearch-head
npm install
npm run start
# 浏览器打开 http://localhost:9100

8.x 之后 Kibana 自带 Dev Tools Console,更现代,建议用 Kibana。

九、必备小工具

工具用途绿色版路径
HeidiSQLMySQL/MariaDB 客户端D:\portable\dev\heidisql
RedisDesktopManagerRedis GUID:\portable\dev\rdm
CaddyHTTP 服务器D:\portable\dev\caddy
7-Zip解压系统自带 / scoop 装
ripgrep文件搜索D:\portable\dev\rg\rg.exe

十、便携版目录约定

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
D:\portable\
├── dev\
│   ├── mingw64\
│   ├── cmake-3.28.3\
│   ├── apache-maven-3.9.4\
│   ├── gradle-8.5\
│   ├── nvm\
│   ├── nodejs\        # nvm 切版本时切换的软链目标
│   ├── ffmpeg\
│   ├── sqlite3\
│   ├── protoc-21.3\
│   ├── elasticsearch-8.11.0\
│   ├── caddy\
│   └── .m2\           # 本地 Maven 仓库
└── path\bin\          # 全部 exe 软链

十一、常见坑

现象原因对策
g++ 链接缺 dll默认动态链接-static-libgcc -static-libstdc++
Maven 下载 jar 卡死仓库无代理配 Nexus / 阿里云镜像
Gradle 启动报 JAVA_HOME 错JDK 路径含空格重装 JDK 到无空格目录如 C:\java\jdk-17
ffmpeg 合成提示 “Experimental”AAC 编码-strict -2
sqlite3 中文乱码命令行编码chcp 65001 切 UTF-8
protoc 找不到 .proto-I 路径错绝对路径或 cd 到 .proto 所在目录
Elasticsearch 启动 OOMJVM 堆太小config/jvm.options-Xms2g -Xmx2g

十二、下一步

  • C/C++ 进阶:CMake + vcpkg / Conan 跨平台包管理
  • Maven 进阶:maven-shade-plugin 打 fat jar、maven-assembly-plugin 自定义打包
  • Node 进阶:pnpm / yarn / corepack 多包管理器
  • Elasticsearch 进阶:用 Docker 部署集群(参考 2019-06-20《Docker 进阶与运维》)

十三、参考资料

使用 Hugo 构建
主题 StackJimmy 设计