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

Mars 项目中的 Zstandard 多平台构建指南:Visual Studio 工程、VS 命令行脚本、CMake 与 Meson 构建系统详解 网络通信移动开发【免费下载链接】marsMars 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/cmakeVS2005Visual Studio 2005 工程官方说明中已注明该项目被移入 contrib 目录且不再维护因此当前仓库build/下不再包含它已移除VS2008Visual Studio 2008 工程.vcproj格式build/VS2008VS2010Visual Studio 2010 工程.vcxproj格式同样兼容 VS2012/2013/2015build/VS2010VS_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.exedatagen合成数据生成器参数可配用于测试datagen.exefullbench精确测量 zstd 各内部函数的处理速度fullbench.exefuzzer测试工具用于在目标平台上校验 zstd 的完整性/鲁棒性fuzzer.exelibzstd静态 ZSTD 库libzstd_static.liblibzstd-dll动态 ZSTD 库DLL同时生成导入库libzstd.dlllibzstd.libfullbench-dll使用导入库链接的 fullbench 版本运行依赖 ZSTD DLLfullbench-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 2013msvcr120.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 2015msvcr140.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 运行时依赖的程序只需把末尾参数换为v120build.generic.cmd VS2015 Win32 Release v120 build.generic.cmd VS2015 x64 Release v120需要 Debug 版时把Release换成Debug即可。3.4 Visual Studio 2017build.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_TESTSON -DZSTD_LEGACY_SUPPORTON .. make对照 build/cmake/CMakeLists.txt核心选项及其底层行为如下选项默认值源码层行为依据 CMakeLists.txtZSTD_LEGACY_SUPPORTOFF开启后定义-DZSTD_LEGACY_SUPPORT5并将lib/legacy下zstd_v01~zstd_v07共 7 个旧格式源码加入编译ZSTD_MULTITHREAD_SUPPORTON开启多线程链接 pthreadUNIX 下需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二者不可同时为 OFFZSTD_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 个皆可不使用 Tabif/else/endif、foreach/endforeach、while/endwhile、macro/endmacro、function/endfunction的结尾使用空命令形式endif()避免endif(FOOVAR)这种带参数的写法推荐add_executable(foo foo.c)而非ADD_EXECUTABLE(...)等混合大小写写法。五、跨平台构建方式二MesonMeson 是面向开发效率的现代化构建系统开箱即用地支持单元测试、覆盖率报告、Valgrind、CCache 等工具链集成。zstd 的 Meson 支持位于 build/meson说明文档为 build/meson/README.md。5.1 构建与安装Meson 构建输出一个libzstd具体是共享库还是静态库由default_library选项决定。基本流程cd build/meson meson setup -Dbin_programstrue -Dbin_contribtrue builddir cd builddir ninja # 构建 ninja install # 安装如需安装到临时暂存目录staging而非系统目录可借助DESTDIRDESTDIR./staging ninja install构建配置完成后可用meson configure查看/修改各选项。5.2 Meson 配置选项对照 build/meson/meson_options.txt主要选项如下选项类型/默认值说明legacy_levelinteger默认 5范围 0~7旧格式支持等级7 到 1 对应支持 v0.7 到 v0.1debug_levelinteger默认 1范围 0~9运行时调试级别参见lib/common/debug.hbacktraceboolean默认 false运行时异常时是否输出栈回溯static_runtimeboolean默认 falseMSVC 下是否链接静态运行时库bin_programsboolean默认 true是否构建 programszstd CLIbin_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 及工具集参数、CMakeout-of-source 构建与核心选项与 Mesonsetup/ninja 与配置项并印证了其在 Mars xlog 模块中的静态库集成方式。实际构建时请以本仓库build/下的工程文件为准并注意各构建系统选项的默认值如 CMake 默认Release、测试默认关闭、legacy 支持默认关闭对产物形态的影响。赞分享网络通信移动开发【免费下载链接】marsMars is a cross-platform network component developed by WeChat.项目地址https://gitcode.com/gh_mirrors/ma/mars点击查看免费下载相关推荐Zstandard 构建体系全指南从 Visual Studio 到 CMake/Meson 的多平台编译实战Zstandard 构建体系全指南从 Visual Studio 到 CMake/Meson 的多平台编译实战 Zstandardzstd不仅提供高速压缩数据工程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网络安全密码学通信嵌入式上一篇TempestSDR3分钟掌握开源电磁泄漏检测的终极指南下一篇医学影像的魔法如何用InVesalius将二维CT/MRI变成三维立体模型创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考