
ZeroTierOne 交叉编译指南在 Linux 上如何用 mingw-w64 快速构建 Windows 版【免费下载链接】ZeroTierOneA Smart Ethernet Switch for Earth项目地址: https://gitcode.com/GitHub_Trending/ze/ZeroTierOneZeroTierOne 是把异地设备拉进同一个虚拟局域网的 P2P 组网程序Windows 用户装它通常只拿到官方安装包。想在 Linux 主机上直接产出 Windows 可执行文件靠的就是 mingw-w64 交叉编译——在 Linux 上运行一套 GCC 工具链直接输出 PE 格式的 Windows 程序无需安装 Visual Studio。本文完整走一遍 ZeroTierOne 交叉编译流程并解释构建脚本里 Windows 相关的几处关键处理。做完一遍你可以独立做到为 mingw-w64 写一份可用的 CMake 工具链文件完成 Windows x64 版 zerotier-one.exe 的完整构建定位交叉编译特有的链接报错并验证产物 准备清单依赖项用途安装或确认方式mingw-w64x86_64 目标Windows 交叉编译工具链GCC 需 8.x 以上apt install mingw-w64Debian/UbuntuCMake 3.15构建生成器CMakeLists.txt 声明的最低版本cmake --versionninja并行编译比 make 更快apt install ninja-buildRust可选SSO/OIDC 组件 rustybits 的编译依赖rustup target add x86_64-pc-windows-gnuOpenTelemetry API构建所需头文件由官方脚本预置到.deps执行 scripts/bootstrap-deps.sh装完跑一条环境自检确认三个组件都在x86_64-w64-mingw32-g --version cmake --version ninja --version预期三行版本号依次打印。任何一条找不到命令先补齐对应依赖再往下走。 动手构建1. 获取源码源码来自官方仓库本地没有则克隆一份git clone https://gitcode.com/GitHub_Trending/ze/ZeroTierOne.git cd ZeroTierOne预期当前目录出现 CMakeLists.txt、windows/、scripts/ 等顶层条目。2. 安装并验证 mingw-w64Debian/Ubuntu 系一条命令装齐编译器、链接器和交叉汇编器装完执行上一节的自检命令看到 gcc 版本号即通过。3. 配置 CMake 工具链文件工具链文件告诉 CMake「编译器、目标系统、依赖搜索范围」三件事。在仓库根目录新建toolchain-mingw64.cmake仓库本身不带这份文件内容如下不超过 15 行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 会按它选择编译器与目标。4. 预置构建依赖CMake 构建依赖 OpenTelemetry API 头文件官方提供了预置脚本把固定版本装进.deps目录scripts/bootstrap-deps.sh预期末尾打印一行CMAKE_PREFIX_PATH记下该路径默认是仓库内的.deps。5. 执行首次配置单独开一个构建目录避免污染源码树cmake -S . -B build-win64-mingw -G Ninja \ -DCMAKE_TOOLCHAIN_FILEtoolchain-mingw64.cmake \ -DCMAKE_BUILD_TYPERelease \ -DCMAKE_PREFIX_PATH$PWD/.deps预期结尾打印配置成功信息且日志中出现Target CPU (CMAKE_SYSTEM_PROCESSOR): x86_64。6. 编译并收集产物cmake --build build-win64-mingw -j file build-win64-mingw/zerotier-one.exe预期file输出PE32 executable (console) x86-64。多配置生成器下产物可能在Release/子目录本流程用 Ninja 单配置exe 直接位于构建目录根部。 构建要点剖析要点一架构探测决定加密汇编路径。工具链文件里CMAKE_SYSTEM_PROCESSOR不是可选项——CMakeLists.txt 用它选择架构分支x86_64 分支会打开 Salsa2012、Ed25519 的 x64 汇编加速源码在 ext/x64-salsa2012-asm/ 与 ext/ed25519-amd64-asm/。这些.s文件是 GNU 汇编语法mingw 的交叉汇编器as可以直接汇编所以该分支对 mingw 是安全的。白话讲你不声明目标架构CMake 就按宿主的架构走产物里的加密代码路径会整个错位。要点二Windows 服务代码与系统库是条件挂载的。CMake 在 Windows 目标下把服务层源码直接编进主程序if(WIN32) target_sources(zerotier-one PRIVATE windows/ZeroTierOne/ServiceBase.cpp windows/ZeroTierOne/ServiceInstaller.cpp windows/ZeroTierOne/ZeroTierOneService.cpp) endif()同时按 windows/ZeroTierOne/ZeroTierOne.vcxproj 的清单补上系统库if(WIN32) list(APPEND LINKED_LIBRARIES ws2_32 wsock32 Iphlpapi Rpcrt4 bcrypt crypt32 ncrypt ntdll secur32 userenv wbemuuid) endif()白话讲MSVC 工程里的 import library.lib在 mingw 里以.a导入库形式提供链接器名相同所以这份清单两边通用。另外注意注释TAP 驱动与 SDK 留在 MSBuild 方案里mingw 交叉编译只产出守护进程本体驱动安装和签名仍需在 Windows 侧完成。⚠️ 踩坑速查报错现象可能原因解决方式undefined reference to __imp__WSAStartup4手动链接时漏了系统库或目标库未进链接清单确认 CMakeLists.txt 的if(WIN32)清单参与链接手动链接时补上ws2_32 wsock32 IphlpapiCould NOT find opentelemetry-cpp交叉编译时 CMake 找到了宿主侧的头文件而非目标侧确认工具链文件的CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY生效且-DCMAKE_PREFIX_PATH指向 scripts/bootstrap-deps.sh 输出的.depscargo 报 host 架构不匹配此类场景常见Windows 目标定义了ZT_SSO_ENABLEDrustybits 仍需 Rust 交叉编译cargo配置目标-C targetx86_64-pc-windows-gnu、-C linkerx86_64-w64-mingw32-gcc、-C archiverx86_64-w64-mingw32-ar、-C rustflags-C target-featurecrt-static配置成功但产物是 Linux ELF工具链文件未生效CMake 回退到宿主 gcc重新配置前删掉构建目录确认-DCMAKE_TOOLCHAIN_FILE路径正确✅ 结果验证与收尾file确认 PE32 只是第一步。把 exe 拷到 Windows 机器或用 Wine执行./zerotier-one.exe -h预期输出开头如下摘自 build.md 官方文档说明zerotier-one(8) -- ZeroTier One virtual network endpoint service-h的完整参数表见 doc/zerotier-one.8.md。另外两个可自查的信号程序按 version.h 上报平台码交叉编译产物应与 vcxproj 一致Windows 平台码 2、x86_64 架构码 2若数值不对多半是架构分支没选对。到此从 Linux 主机到可用的 Windows 版 ZeroTierOne 守护进程就只隔着一个工具链文件和两条 CMake 命令。下一步可以把工具链文件加进 CI 流水线用容器固化 mingw 环境让每次提交都自动产出 Windows 工件。如果这篇 ZeroTierOne 交叉编译指南对你有用欢迎顺手点个关注。【免费下载链接】ZeroTierOneA Smart Ethernet Switch for Earth项目地址: https://gitcode.com/GitHub_Trending/ze/ZeroTierOne创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考