- 网络
- 通信
- 移动开发
【免费下载链接】mars
Mars is a cross-platform network component developed by WeChat.
Zstandard(简称 zstd)是 Facebook 开源的高性能无损压缩算法库,在本仓库中被 Mars(微信跨平台网络组件)的 xlog 日志模块作为压缩核心依赖使用。本指南以仓库中mars/zstd/build/目录下官方构建说明为主体,系统讲解 zstd 在 Windows 下的 Visual Studio 工程编译、无 IDE 命令行编译,以及跨平台的 CMake 与 Meson 构建流程。读完本文,你将掌握 zstd 在 Windows/跨平台环境下的完整构建方式、各构建系统核心配置项含义,并了解其在本仓库 Mars 项目中的实际集成方式。
一、build目录概览:zstd 的 IDE 构建工程集合
在开始构建之前,先明确 zstd 官方为不同集成开发环境(IDE)与构建系统准备了哪些工程。根据 build 目录总说明,zstd 发行版中包含以下工程:
| 工程/目录 | 说明 | 仓库中的实际位置 |
|---|---|---|
cmake | CMake 工程,由 Artyom Dymchenko 贡献,跨平台生成构建脚本 | build/cmake |
VS2005 | Visual Studio 2005 工程(官方说明中已注明该项目被移入 contrib 目录且不再维护,因此当前仓库build/下不再包含它) | 已移除 |
VS2008 | Visual Studio 2008 工程(.vcproj格式) | build/VS2008 |
VS2010 | Visual Studio 2010 工程(.vcxproj格式,同样兼容 VS2012/2013/2015) | build/VS2010 |
VS_scripts | 无需打开 IDE 的 Visual Studio 命令行编译脚本 | build/VS_scripts |
以 VS2010 目录为例,仓库中实际包含的工程文件为:zstd.sln解决方案、zstd(命令行工具)、datagen(数据生成器)、fullbench(基准测试)、fullbench-dll、fuzzer(模糊测试)、libzstd(静态库)、libzstd-dll(动态库),以及资源文件zstd.rc、libzstd-dll.rc和共享属性文件CompileAsCpp.props。
二、用 Visual Studio 编译 zstd:从解决方案到可执行文件
2.1 完整编译步骤
官方文档给出了一套在 Windows 上通过 Visual Studio IDE 编译 zstd 的标准流程,步骤如下:
- 安装 Visual Studio(例如免费的 VS2015 Community 版);
- 获取 zstd 源码(从官方发布渠道下载最新版本的源码压缩包);
- 解压 ZIP 压缩包;
- 进入解压目录,再进入
projects(在本仓库中对应build/VS2010)下的VS2010目录,打开zstd.sln解决方案文件; - Visual Studio 会询问是否将 VS2010 工程转换为当前版本(如 VS2015),选择同意转换;
- 将构建配置从
Debug切换为Release;如果是 64 位 Windows,同时把平台从Win32切换为x64; - 按
F7键,或从菜单栏选择BUILD→Build Solution编译整个解决方案; - 编译成功后,可执行文件将生成在
bin\x64\Release\zstd.exe这类路径下(以解决方案目录为基准)。
注意:原文档中输出路径写为
projects\VS2010\bin\...与visual\VS2010\bin\$(Platform)_$(Configuration)\zstd.exe,这是以 zstd 原始仓库目录结构为基准的表述。在本仓库中,对应目录即 build/VS2010,编译产物会输出到build/VS2010/bin/$(平台)_$(配置)/下,例如 x64 + Release 对应bin/x64_Release/zstd.exe。
2.2zstd.sln解决方案中包含的工程
打开 build/VS2010/zstd.sln,其中包含多个工程,编译产物统一输出到bin\$(Platform)_$(Configuration)目录。各工程的作用如下:
| 工程名 | 说明 | 输出 |
|---|---|---|
zstd | 命令行工具,支持类 gzip 的参数风格 | zstd.exe |
datagen | 合成数据生成器,参数可配,用于测试 | datagen.exe |
fullbench | 精确测量 zstd 各内部函数的处理速度 | fullbench.exe |
fuzzer | 测试工具,用于在目标平台上校验 zstd 的完整性/鲁棒性 | fuzzer.exe |
libzstd | 静态 ZSTD 库 | libzstd_static.lib |
libzstd-dll | 动态 ZSTD 库(DLL),同时生成导入库 | libzstd.dll+libzstd.lib |
fullbench-dll | 使用导入库链接的 fullbench 版本,运行依赖 ZSTD DLL | fullbench-dll.exe |
这些工程与 VS2008 目录(.vcproj旧格式,含zstd、fuzzer、fullbench、zstdlib四个工程)形成新旧两套工程体系,VS2008 格式仅适用于旧版 IDE。
2.3 在 Visual C++ 工程中链接 ZSTD DLL
要在自己的 Microsoft Visual C++ 工程中使用 zstd 的动态库版本,需要两个文件:头文件 lib/zstd.h 与导入库build/VS2010/bin/$(Platform)_$(Configuration)/libzstd.lib。配置方法如下:
- 头文件路径:在 Visual Studio IDE 中打开项目属性,进入
C/C++属性页 →General(常规),在Additional Include Directories(附加包含目录)中加入头文件所在目录; - 导入库:在项目属性的
Linker(链接器)→Input(输入)页面,把libzstd.lib加入Additional Dependencies(附加依赖项)。如果只填写库名libzstd.lib而不带完整路径,则还需要在Linker\General\Additional Library Directories(附加库目录)中指定库所在目录。
编译出的可执行程序在运行时需要 ZSTD DLL,该 DLL 位于build/VS2010/bin/$(Platform)_$(Configuration)/libzstd.dll,需要与可执行文件一同部署。
三、无 IDE 的命令行编译:VS_scripts脚本
如果不想打开 Visual Studio 界面,可以使用 build/VS_scripts 目录中的命令行脚本,该目录附有独立的 使用说明。脚本会在bin\Release\{ARCH}\目录下输出编译结果。
3.1 Visual Studio 2013(msvcr120.dll)
直接运行build.VS2013.cmd会同时编译Release Win32与Release x64两个版本。若只需单一架构或需要 Debug 版本,使用build.generic.cmd并显式传参:
:: 仅 Win32 Release build.generic.cmd VS2013 Win32 Release v120 :: 仅 x64 Release build.generic.cmd VS2013 x64 Release v120 :: Debug 版本(Win32 / x64) build.generic.cmd VS2013 Win32 Debug v120 build.generic.cmd VS2013 x64 Debug v120其中末尾的v120对应 VS2013 的工具集版本号(runtime 为 msvcr120.dll)。
3.2 Visual Studio 2015(msvcr140.dll)
运行build.VS2015.cmd默认构建Release Win32与Release x64双版本;单架构与 Debug 版本同样通过build.generic.cmd指定:
:: 双版本 Release build.VS2015.cmd :: 仅 Win32 / 仅 x64 Release build.generic.cmd VS2015 Win32 Release v140 build.generic.cmd VS2015 x64 Release v140 :: Debug 版本 build.generic.cmd VS2015 Win32 Debug v140 build.generic.cmd VS2015 x64 Debug v140v140对应 VS2015 工具集(msvcr140.dll),编译结果分别在bin\Release\Win32\与bin\Release\x64\目录。
3.3 用 VS2015 编译出 msvcr120 运行时
脚本的一个实用特性是可以用 VS2015 的工具链生成 msvcr120.dll 运行时依赖的程序,只需把末尾参数换为v120:
build.generic.cmd VS2015 Win32 Release v120 build.generic.cmd VS2015 x64 Release v120需要 Debug 版时把Release换成Debug即可。
3.4 Visual Studio 2017
build.VS2017.cmd会按 Enterprise > Professional > Community 的优先级,自动查找并编译第一个可用的 VS2017 变体,同样输出Release Win32与Release x64两个版本。如果需要锁定特定版本,可使用针对性的脚本,例如build.VS2017Enterprise.cmd。
四、跨平台构建方式一:CMake
对于 Linux/macOS 等非 Windows 平台,或需要自定义构建选项的场景,推荐使用 build/cmake 下的 CMake 工程,其详细说明见 build/cmake/README.md。
4.1 推荐做法:Out-of-Source 构建
CMake 没有类似make clean的命令,因此官方强烈建议采用“源码外构建”(out of source build)——新建独立目录并在其中编译,清理时直接删除该目录即可:
cd build/cmake mkdir builddir cd builddir cmake .. make清理缓存只需删除构建目录:
rm -rf build/cmake/builddir当然,也可以在build/cmake目录内直接构建(不推荐,因为会污染源码目录):
cd build/cmake cmake make查看全部可配置的构建选项:
cd build/cmake/builddir cmake -LH ..4.2 常用 CMake 选项
布尔选项通过-D[option]=ON/OFF设置,例如同时开启测试与旧格式兼容:
cd build/cmake/builddir cmake -DZSTD_BUILD_TESTS=ON -DZSTD_LEGACY_SUPPORT=ON .. make对照 build/cmake/CMakeLists.txt,核心选项及其底层行为如下:
| 选项 | 默认值 | 源码层行为(依据 CMakeLists.txt) |
|---|---|---|
ZSTD_LEGACY_SUPPORT | OFF | 开启后定义-DZSTD_LEGACY_SUPPORT=5,并将lib/legacy下zstd_v01~zstd_v07共 7 个旧格式源码加入编译 |
ZSTD_MULTITHREAD_SUPPORT | ON | 开启多线程,链接 pthread(UNIX 下需find_package(Threads REQUIRED)),并为库目标追加ZSTD_MULTITHREAD编译定义 |
ZSTD_BUILD_PROGRAMS | OFF | 构建programs子目录(zstd CLI),需先构建静态库 |
ZSTD_BUILD_TESTS | OFF | 构建tests子目录,同样依赖静态库 |
ZSTD_BUILD_CONTRIB | OFF | 构建contrib子目录 |
ZSTD_BUILD_STATIC/ZSTD_BUILD_SHARED | ON/ON | 是否生成静态库libzstd_static/ 共享库libzstd(定义于 build/cmake/lib/CMakeLists.txt),二者不可同时为 OFF |
ZSTD_PROGRAMS_LINK_SHARED | OFF | CLI 是否链接共享库 |
此外,工程还自动从 lib/zstd.h 解析版本号(本仓库为 1.4.4),并通过GetZstdLibraryVersion模块注入工程版本;若未显式指定构建类型,默认设为Release。CMake 工程还额外提供了clean-all自定义目标,可一次性清除构建产物。
4.3 CMake 代码风格约定(面向贡献者)
build/cmake/README.md还列出了编写 CMake 脚本时的风格建议,供后续维护者参考:
- 命令一律小写(现代 CMake 2.6+ 约定),变量名大写,且单个文件内保持一致;
- 缩进使用空格(2/3/4 个皆可),不使用 Tab;
if/else/endif、foreach/endforeach、while/endwhile、macro/endmacro、function/endfunction的结尾使用空命令形式(endif()),避免endif(FOOVAR)这种带参数的写法;- 推荐
add_executable(foo foo.c)而非ADD_EXECUTABLE(...)等混合大小写写法。
五、跨平台构建方式二:Meson
Meson 是面向开发效率的现代化构建系统,开箱即用地支持单元测试、覆盖率报告、Valgrind、CCache 等工具链集成。zstd 的 Meson 支持位于 build/meson,说明文档为 build/meson/README.md。
5.1 构建与安装
Meson 构建输出一个libzstd,具体是共享库还是静态库由default_library选项决定。基本流程:
cd build/meson meson setup -Dbin_programs=true -Dbin_contrib=true builddir cd builddir ninja # 构建 ninja install # 安装如需安装到临时暂存目录(staging)而非系统目录,可借助DESTDIR:
DESTDIR=./staging ninja install构建配置完成后,可用meson configure查看/修改各选项。
5.2 Meson 配置选项
对照 build/meson/meson_options.txt,主要选项如下:
| 选项 | 类型/默认值 | 说明 |
|---|---|---|
legacy_level | integer,默认 5,范围 0~7 | 旧格式支持等级:7 到 1 对应支持 v0.7+ 到 v0.1+ |
debug_level | integer,默认 1,范围 0~9 | 运行时调试级别,参见lib/common/debug.h |
backtrace | boolean,默认 false | 运行时异常时是否输出栈回溯 |
static_runtime | boolean,默认 false | MSVC 下是否链接静态运行时库 |
bin_programs | boolean,默认 true | 是否构建 programs(zstd CLI) |
bin_tests | boolean,默认 false | 是否构建测试 |
bin_contrib | boolean,默认 false | 是否构建 contrib 扩展 |
multi_thread | feature,默认 enabled | 检测到 pthread 时启用多线程 |
zlib/lzma/lz4 | feature,默认 auto | 是否启用 zlib/lzma/lz4 支持 |
六、本仓库中的实际应用:zstd 与 Mars 的集成
上述构建知识在本仓库中有直接的落地场景:Mars 的 xlog 日志模块以 zstd 作为压缩后端。从顶层 mars/CMakeLists.txt 可以看到,Mars 构建时引入libzstd_static(静态库目标);而在 xlog 日志解码工具 中,decode_log_file可执行程序通过target_link_libraries(decode_log_file libzstd_static)直接链接 zstd 静态库,用于离线解析和解压 xlog 加密日志文件。
这意味着:在需要把 zstd 集成进自有工程的场景中,你可以参照本文第四节的 CMake 流程产出libzstd_static,参照第二节在 Windows 上产出 DLL 并在 VC++ 工程中配置头文件与导入库,或参照第五节用 Meson 产出共享/静态库——Mars 采用的正是其中的静态库链接路线,这也是 zstd 官方构建说明在真实大型跨平台项目中的典型实践。
七、小结
本文围绕仓库内 zstd 构建说明 及build/下各构建工程,完整覆盖了 zstd 的四条构建路径:Visual Studio 工程(VS2008/VS2010,含工程清单与 DLL 使用配置)、VS 命令行脚本(VS2013/2015/2017 及工具集参数)、CMake(out-of-source 构建与核心选项)与 Meson(setup/ninja 与配置项),并印证了其在 Mars xlog 模块中的静态库集成方式。实际构建时,请以本仓库build/下的工程文件为准,并注意各构建系统选项的默认值(如 CMake 默认Release、测试默认关闭、legacy 支持默认关闭)对产物形态的影响。
- 网络
- 通信
- 移动开发
【免费下载链接】mars
Mars is a cross-platform network component developed by WeChat.
相关推荐
Zstandard 构建体系全指南:从 Visual Studio 到 CMake/Meson 的多平台编译实战
Zstandard 构建体系全指南:从 Visual Studio 到 CMake/Meson 的多平台编译实战 Zstandard(zstd)不仅提供高速压缩
数据工程Zstandard 无 IDE 命令行构建指南:用 VS_scripts 脚本编译 Visual Studio 版本
Zstandard 无 IDE 命令行构建指南:用 VS_scripts 脚本编译 Visual Studio 版本 本指南围绕 Zstandard 仓库 bu
数据工程PolarSSL构建系统详解:Make、CMake与Visual Studio终极指南
PolarSSL构建系统详解:Make、CMake与Visual Studio终极指南 PolarSSL(现名Mbed TLS)是一个轻量级的开源SSL/TLS
网络安全密码学通信嵌入式
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考