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-msvc | rustybits 的 Windows 目标三元组 | rustup target list --installed |
| Wine(可选) | 在 Linux 上试跑 exe | wine --version |
Ubuntu/Debian 上一条命令装好大部分:
sudo apt install -y mingw-w64 cmake ninja-build git wineRust 单独安装并追加目标:
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),仅供参考