☰
ZeroTierOne Linux 交叉编译:5 步在 Linux 上产出 Windows x64 虚拟网络守护进程
2026/10/9 0:28:28 网站建设 项目流程

ZeroTierOne Linux 交叉编译:5 步在 Linux 上产出 Windows x64 虚拟网络守护进程

【免费下载链接】ZeroTierOneA Smart Ethernet Switch for Earth项目地址: https://gitcode.com/GitHub_Trending/ze/ZeroTierOne

ZeroTierOne 是一个 P2P 虚拟网络守护进程,它穿透 NAT 把分散各处的设备拉进同一张虚拟局域网。官方 Windows 构建走的是 MSVC 路线,但你完全可以用 mingw-w64 交叉工具链在 Linux 上得到同样的zerotier-one.exe。这套流程面向第一次接触交叉编译的读者:工具链安装、依赖准备、编译、验证,每一步都给了可直接复制的命令。做完后你手里会有一个能直接放到 Windows 机器上运行的 x64 版守护进程。

一分钟看懂目标

一句话说清:交叉编译就是在一台机器上运行编译器、产出另一台机器可执行的程序;mingw-w64 是 GCC 体系下"模拟 Windows 运行时"的编译器加 API 库组合。

  • 输入:ZeroTierOne 源码 + 一台 Linux x86_64 主机
  • 产出:zerotier-one.exe(Windows x64 用户态守护进程,同时是服务程序)
  • 不产出:windows/TapDriver6/ 里的 TAP 内核驱动,它必须用 WDK 单独构建

动手前核对清单

工具作用验证命令
mingw-w64(x86_64 版)交叉编译器 + Windows API 库x86_64-w64-mingw32-gcc --version
CMake ≥ 3.15(建议 ≥ 3.21)构建系统生成器cmake --version
Ninja依赖引导脚本使用的构建工具ninja --version
git获取源码git --version
Rust + cargo编译 rustybits 静态库cargo --version
Rust target:x86_64-pc-windows-msvcrustybits 的 Windows 目标三元组rustup target list --installed
Wine(可选)在 Linux 上试跑 exewine --version

Ubuntu/Debian 上一条命令装好大部分:

sudo apt install -y mingw-w64 cmake ninja-build git wine

Rust 单独安装并追加目标:

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh rustup target add x86_64-pc-windows-msvc

成功的样子:上面每一条验证命令都能打印版本号,而不是command not found。

执行流程

步骤 1:获取源码

先把源码落到磁盘上。

git clone https://gitcode.com/GitHub_Trending/ze/ZeroTierOne cd ZeroTierOne

成功的样子:当前目录出现 CMakeLists.txt 和 scripts/bootstrap-deps.sh。

步骤 2:准备头文件版 OpenTelemetry 依赖

CMake 脚本要求 opentelemetry-cpp 的 API 能在依赖前缀里找到,仓库自带引导脚本,默认安装到.deps。

scripts/bootstrap-deps.sh

成功的样子:脚本末尾打印==> Done (API-only). Build the daemon with:,并且.deps下出现lib/cmake/opentelemetry-cpp(或lib64变体)。

步骤 3:编写 mingw-w64 工具链文件

CMake 需要一份工具链文件,声明目标是 Windows、用哪套编译器。在源码根目录新建toolchain-mingw64.cmake:

set(CMAKE_SYSTEM_NAME Windows) set(CMAKE_SYSTEM_PROCESSOR x86_64) set(CMAKE_C_COMPILER x86_64-w64-mingw32-gcc) set(CMAKE_CXX_COMPILER x86_64-w64-mingw32-g++) set(CMAKE_RC_COMPILER x86_64-w64-mingw32-windres) set(CMAKE_FIND_ROOT_PATH /usr/x86_64-w64-mingw32) set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)

成功的样子:文件保存无误。CMAKE_SYSTEM_PROCESSOR必须显式指定,否则架构检测可能命中 CMakeLists.txt 里的Unsupported/undetected CPU architecture致命错误。

步骤 4:配置构建

cmake -S . -B build-win \ -DCMAKE_TOOLCHAIN_FILE=toolchain-mingw64.cmake \ -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_PREFIX_PATH="$PWD/.deps"

成功的样子:输出以-- Build files written to: .../build-win结尾,全程没有CMake Error。

步骤 5:编译

cmake --build build-win -j$(nproc)

成功的样子 📦:build-win目录下生成zerotier-one.exe。编译过程中会自动经 cargo 构建 rustybits 静态库,耗时稍长属正常。

坑点与要点

  • 现象:链接报undefined reference to 'WSAStartup'。原因:没走 mingw 工具链(误用主机 gcc),或动过链接列表。处理:确认编译器是x86_64-w64-mingw32-g++;Windows 目标下 CMake 已自动追加ws2_32、wsock32、Iphlpapi等系统库,保持默认即可。
  • 现象:配置阶段报opentelemetry-cpp (API) was not found on CMAKE_PREFIX_PATH。原因:没跑步骤 2 的引导脚本,或配置时没把前缀传进去。处理:先执行scripts/bootstrap-deps.sh,再带上-DCMAKE_PREFIX_PATH=$PWD/.deps重新配置。
  • 现象:ZT1_CENTRAL_CONTROLLER is not supported on Windows。原因:打开了中央控制器选项。处理:Windows 目标只支持守护进程,去掉-DZT1_CENTRAL_CONTROLLER。
  • 现象:cargo: command not found,或找不到rustybits.lib。原因:Rust 未安装或缺目标三元组。处理:装好 rustup 后执行rustup target add x86_64-pc-windows-msvc。
  • 要点(组件原理):Windows 下 one.cpp 会把 windows/ZeroTierOne/ 的服务封装一起编进同一个可执行文件。所以zerotier-one.exe本身就是服务程序,装成服务前也可以直接命令行方式试跑。
  • 要点(组件原理):windows/TapDriver6/ 是内核态 TAP 驱动,无法用 mingw 交叉产出。真机测试可以临时关闭驱动签名强制,正式发布必须签名 ⚠️。

验证你的成果

一条命令确认产物格式:

file build-win/zerotier-one.exe

预期输出片段(关键看开头的PE32+与x86-64):

build-win/zerotier-one.exe: PE32+ executable (console) x86-64, ...

装了 Wine 的话可以补跑一次帮助信息,出现Usage: zerotier-one [-switches] [home directory]即正常;完整参数说明见 doc/zerotier-one.8.md。

常见问题

Q1:为什么没有 zerotier-selftest.exe,是不是构建失败了?

不是。selftest 在 Windows 平台本来就不构建,CMake 里有明确的NOT WIN32跳过逻辑,缺少这个产物属于预期行为。

Q2:为什么不用 CMakePresets.json 里的 windows-x64 预设?

那组预设为原生 Windows 准备:生成器是 Visual Studio 17、依赖 vcpkg,且condition只在 Windows 主机上生效。在 Linux 上预设列表里根本不会出现它,所以走工具链文件方案。

Q3:默认构建和-DZT_NONFREE=OFF有什么区别?

默认会把内置的 FileDB 网络控制器编译进守护进程;传 OFF 得到不带控制器的免费版,体积更小。各平台在 CMakePresets.json 里都配了对应的*-free预设,可作参考。

收尾

到这里,你已能在 Linux 服务器上产出 Windows 版 ZeroTierOne 守护进程,全程无需打开一台 Windows 机器。想再进一步,可以试-DZT_NONFREE=OFF的轻量构建,版本差异查阅 RELEASE-NOTES.md。觉得这套流程有用的话,顺手点个关注,后续继续更新其他平台的交叉编译实践。

【免费下载链接】ZeroTierOneA Smart Ethernet Switch for Earth项目地址: https://gitcode.com/GitHub_Trending/ze/ZeroTierOne

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询