news 2026/9/21 2:39:54

Mars 项目中的 Zstandard 多平台构建指南:Visual Studio 工程、VS 命令行脚本、CMake 与 Meson 构建系统详解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Mars 项目中的 Zstandard 多平台构建指南:Visual Studio 工程、VS 命令行脚本、CMake 与 Meson 构建系统详解
  • 网络
  • 通信
  • 移动开发

【免费下载链接】mars

Mars is a cross-platform network component developed by WeChat.

项目地址:https://gitcode.com/gh_mirrors/ma/mars
点击查看免费下载

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 发行版中包含以下工程:

工程/目录说明仓库中的实际位置
cmakeCMake 工程,由 Artyom Dymchenko 贡献,跨平台生成构建脚本build/cmake
VS2005Visual Studio 2005 工程(官方说明中已注明该项目被移入 contrib 目录且不再维护,因此当前仓库build/下不再包含它)已移除
VS2008Visual Studio 2008 工程(.vcproj格式)build/VS2008
VS2010Visual Studio 2010 工程(.vcxproj格式,同样兼容 VS2012/2013/2015)build/VS2010
VS_scripts无需打开 IDE 的 Visual Studio 命令行编译脚本build/VS_scripts

以 VS2010 目录为例,仓库中实际包含的工程文件为:zstd.sln解决方案、zstd(命令行工具)、datagen(数据生成器)、fullbench(基准测试)、fullbench-dllfuzzer(模糊测试)、libzstd(静态库)、libzstd-dll(动态库),以及资源文件zstd.rclibzstd-dll.rc和共享属性文件CompileAsCpp.props

二、用 Visual Studio 编译 zstd:从解决方案到可执行文件

2.1 完整编译步骤

官方文档给出了一套在 Windows 上通过 Visual Studio IDE 编译 zstd 的标准流程,步骤如下:

  1. 安装 Visual Studio(例如免费的 VS2015 Community 版);
  2. 获取 zstd 源码(从官方发布渠道下载最新版本的源码压缩包);
  3. 解压 ZIP 压缩包;
  4. 进入解压目录,再进入projects(在本仓库中对应build/VS2010)下的VS2010目录,打开zstd.sln解决方案文件;
  5. Visual Studio 会询问是否将 VS2010 工程转换为当前版本(如 VS2015),选择同意转换;
  6. 将构建配置从Debug切换为Release;如果是 64 位 Windows,同时把平台从Win32切换为x64
  7. F7键,或从菜单栏选择BUILDBuild Solution编译整个解决方案;
  8. 编译成功后,可执行文件将生成在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 DLLfullbench-dll.exe

这些工程与 VS2008 目录(.vcproj旧格式,含zstdfuzzerfullbenchzstdlib四个工程)形成新旧两套工程体系,VS2008 格式仅适用于旧版 IDE。

2.3 在 Visual C++ 工程中链接 ZSTD DLL

要在自己的 Microsoft Visual C++ 工程中使用 zstd 的动态库版本,需要两个文件:头文件 lib/zstd.h 与导入库build/VS2010/bin/$(Platform)_$(Configuration)/libzstd.lib。配置方法如下:

  1. 头文件路径:在 Visual Studio IDE 中打开项目属性,进入C/C++属性页 →General(常规),在Additional Include Directories(附加包含目录)中加入头文件所在目录;
  2. 导入库:在项目属性的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 Win32Release 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 Win32Release 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 v140

v140对应 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 Win32Release 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_SUPPORTOFF开启后定义-DZSTD_LEGACY_SUPPORT=5,并将lib/legacyzstd_v01~zstd_v07共 7 个旧格式源码加入编译
ZSTD_MULTITHREAD_SUPPORTON开启多线程,链接 pthread(UNIX 下需find_package(Threads REQUIRED)),并为库目标追加ZSTD_MULTITHREAD编译定义
ZSTD_BUILD_PROGRAMSOFF构建programs子目录(zstd CLI),需先构建静态库
ZSTD_BUILD_TESTSOFF构建tests子目录,同样依赖静态库
ZSTD_BUILD_CONTRIBOFF构建contrib子目录
ZSTD_BUILD_STATIC/ZSTD_BUILD_SHAREDON/ON是否生成静态库libzstd_static/ 共享库libzstd(定义于 build/cmake/lib/CMakeLists.txt),二者不可同时为 OFF
ZSTD_PROGRAMS_LINK_SHAREDOFFCLI 是否链接共享库

此外,工程还自动从 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/endifforeach/endforeachwhile/endwhilemacro/endmacrofunction/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_levelinteger,默认 5,范围 0~7旧格式支持等级:7 到 1 对应支持 v0.7+ 到 v0.1+
debug_levelinteger,默认 1,范围 0~9运行时调试级别,参见lib/common/debug.h
backtraceboolean,默认 false运行时异常时是否输出栈回溯
static_runtimeboolean,默认 falseMSVC 下是否链接静态运行时库
bin_programsboolean,默认 true是否构建 programs(zstd CLI)
bin_testsboolean,默认 false是否构建测试
bin_contribboolean,默认 false是否构建 contrib 扩展
multi_threadfeature,默认 enabled检测到 pthread 时启用多线程
zlib/lzma/lz4feature,默认 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.

项目地址:https://gitcode.com/gh_mirrors/ma/mars
点击查看免费下载
上一篇:TempestSDR:3分钟掌握开源电磁泄漏检测的终极指南
下一篇:医学影像的魔法:如何用InVesalius将二维CT/MRI变成三维立体模型

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

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/21 2:37:39

Grafana图像渲染插件安装与依赖缺失终极指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/21 2:37:05

VMware虚拟机光标消失原因与修复指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/21 2:37:02

从Fastjson 1.x迁移到Fastjson2:性能、安全与API兼容性实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/21 2:36:15

基于OpenCV和Python的车牌识别系统实现:从图像处理到模板匹配

简介:一套基于OpenCV与Python的车牌识别毕业设计项目,整合Tkinter图形界面与SVM分类模型,面向计算机视觉、图像处理方向的本科毕设、课程设计及实战学习者。系统实现车牌定位、字符分割、特征提取与自动识别,代码覆盖灰度化、直方…

作者头像 李华