curl 版本号与发布机制全解析:从 X.Y.Z 规则到 LIBCURL_VERSION_NUM 数值编码

发布时间:2026/9/11 20:22:22
curl 版本号与发布机制全解析:从 X.Y.Z 规则到 LIBCURL_VERSION_NUM 数值编码 curl 版本号与发布机制全解析从 X.Y.Z 规则到 LIBCURL_VERSION_NUM 数值编码【免费下载链接】curlA command line tool and library for transferring data with URL syntax, supporting DICT, FILE, FTP, FTPS, GOPHER, GOPHERS, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, MQTT, MQTTS, POP3, POP3S, RTSP, SCP, SFTP, SMB, SMBS, SMTP, SMTPS, TELNET, TFTP, WS and WSS. libcurl offers a myriad of powerful features项目地址: https://gitcode.com/GitHub_Trending/cu/curl本篇技术指南以 curl 官方仓库的 docs/VERSIONS.md 为主体系统讲解 curl 命令行工具与 libcurl 库的版本号编排规则主版本/次版本/补丁版本如何递增、十六进制数值版本号的编码与比较机制、版本号在源码中的载体与自动生成流程并完整收录从 1996 年到 2026 年的全部公开发布记录与 Rock-solid 长期支持版本。读完本文你将理解 curl 版本号的全部细节并能熟练地在自己的程序中用LIBCURL_VERSION_NUM做版本兼容判断。一、版本号总体结构X.Y.Z 三段式curl 命令行工具与 libcurl 库各自独立拥有版本号但通常紧密同步。两者的版本号始终采用同一套编排系统X.Y.Z三个字段的含义来自 docs/VERSIONS.mdX主版本号main version numberY次版本号release numberZ补丁版本号patch number在源码层面include/curl/curlver.h 中实际定义#define LIBCURL_VERSION 8.22.1-DEV #define LIBCURL_VERSION_MAJOR 8 #define LIBCURL_VERSION_MINOR 22 #define LIBCURL_VERSION_PATCH 1可见当前仓库快照处于 8.22.1 的开发DEV状态主版本为 8、次版本为 22、补丁版本为 1。二、版本号递增Bumping规则什么时候动哪一位curl 的版本递增规则非常严格每个新版本只递增三个数字中的一个被递增数字右侧的所有数字全部归零例如 1.2.9 之后是 1.2.10而不是 1.3.0。具体触发条件主版本号X仅当发生真正巨大、足以改变世界的变更时才会递增really big, world colliding changes次版本号Y有功能/特性新增或普通变更时递增补丁版本号Z仅仅修复 bug 时递增。以 1.2.3 之后的发布为例可能的结果有变更规模新版本号发生重大变革2.0.0有较大功能变更1.3.0仅修复缺陷1.2.4递增操作是无条件地只影响其中一个数字被递增数字右边的数字允许被重置为零且没有进位上限1 变成 23 变成 49 变成 1088 变成 8999 变成 100。因此 1.2.9 之后是 1.2.103.99.3 之后可能是 3.100.0。需要特别注意的是所有原始 curl 源码发布压缩包都按照 libcurl 的版本号命名而不是按可能不同的 curl 客户端版本号命名。实际上从发布流程看两者始终一致见下文发布脚本部分。三、数值版本号LIBCURL_VERSION_NUM 的十六进制编码为了让那些既要支持新 libcurl 特性、又要能基于旧版本构建的应用程序方便做版本比较每个发布版本都把 libcurl 版本号以静态数值方案存放在curl/curlver.h文件中定义形式为#define LIBCURL_VERSION_NUM 0xXXYYZZ其中XX、YY、ZZ分别是主版本、次版本、补丁版本号以十六进制表示每个字段固定占用两位各 8 bit。例如1.2 显示为0x0102009.11.7 显示为0x090b0711 的十六进制是 0x0b这个 6 位十六进制数共 24 bit具备以下关键性质更新的版本必然对应更大的数值——因此可以直接用大于/小于运算符做比较它不体现预发布pre-release编号当前仓库中LIBCURL_VERSION_NUM定义为0x081601对应 8.22.1 开发版见 include/curl/curlver.h。此外同一头文件还提供了三个独立宏include/curl/curlver.h#define LIBCURL_VERSION_MAJOR 8 #define LIBCURL_VERSION_MINOR 22 #define LIBCURL_VERSION_PATCH 13.1 面向应用开发者CURL_VERSION_BITS 与 CURL_AT_LEAST_VERSION在 include/curl/curlver.h 中curl 还提供了两个辅助宏专门用于在应用程序中做至少是某个版本的编译期判断#define CURL_VERSION_BITS(x, y, z) ((x) 16 | (y) 8 | (z)) #define CURL_AT_LEAST_VERSION(x, y, z) \ (LIBCURL_VERSION_NUM CURL_VERSION_BITS(x, y, z))CURL_VERSION_BITS把 x.y.z 拼成同样的 24 位十六进制数值CURL_AT_LEAST_VERSION(x, y, z)则判断当前 libcurl 是否不低于 x.y.z。典型的用法是#if CURL_AT_LEAST_VERSION(7, 80, 0) /* 可以安全使用 7.80.0 引入的 API */ #else /* 降级路径 */ #endif注意LIBCURL_VERSION_NUM之所以不使用CURL_VERSION_BITS()宏拼装是因为 curl 自己的 configure 脚本会直接 grep 该定义需要头文件中包含完整的十六进制字面量——这一点在 include/curl/curlver.h 的注释中明确说明。四、源码中的版本号载体与运行期查询4.1 三处版本号落点版本号在仓库中存在三处直接载体include/curl/curlver.hlibcurl 版本的唯一事实来源由发布脚本在发布时生成该文件自 7.11.2 起独立成头文件src/tool_version.hcurl 命令行工具的版本头它直接#include curl/curlver.h并把CURL_VERSION等宏全部映射到 libcurl 的版本宏如#define CURL_VERSION LIBCURL_VERSION这正是curl 与 libcurl 始终同版本发布在代码层面的体现lib/version.c运行期把版本信息打包进curl_version_info_data结构供curl_version_info()API 查询。4.2 运行期查询curl_version_info 与 CURLVERSION 年龄机制在 lib/version.c 中静态的version_info结构初始化时即填充了CURLVERSION_NOW、LIBCURL_VERSION、LIBCURL_VERSION_NUM等字段调用curl_version_info()lib/version.c时会动态补充 SSL、zlib、brotli、zstd、nghttp2、c-ares 等依赖库的版本信息。与版本号相关的重要机制是 include/curl/curl.h 中定义的CURLversion 枚举年龄age机制CURLVERSION_FIRST, /* 7.10 */ CURLVERSION_SECOND, /* 7.11.1 */ CURLVERSION_THIRD, /* 7.12.0 */ CURLVERSION_FOURTH, /* 7.16.1 */ CURLVERSION_FIFTH, /* 7.57.0 */ CURLVERSION_SIXTH, /* 7.66.0 */ CURLVERSION_SEVENTH, /* 7.70.0 */ CURLVERSION_EIGHTH, /* 7.72.0 */ CURLVERSION_NINTH, /* 7.75.0 */ CURLVERSION_TENTH, /* 7.77.0 */ CURLVERSION_ELEVENTH, /* 7.87.0 */ CURLVERSION_TWELFTH, /* 8.8.0 */返回的curl_version_info_data结构体带有CURLversion age字段且结构体按年龄递增追加字段SECOND 之后新增、THIRD 之后新增……应用程序可据此判断返回结构中哪些字段可用。CURLVERSION_NOW始终指向最新年龄即当前仓库的CURLVERSION_TWELFTH。4.3 发布脚本maketgz 如何自动生成版本号scripts/maketgz 是 curl 官方用来构建发布压缩包的脚本它完整展示了版本号与十六进制数值的生成逻辑scripts/maketgzmajor$(echo $libversion | cut -d. -f1 | sed -e s/[^0-9]//g) minor$(echo $libversion | cut -d. -f2 | sed -e s/[^0-9]//g) patch$(echo $libversion | cut -d. -f3 | cut -d- -f1 | sed -e s/[^0-9]//g) ... numeric$(printf %02x%02x%02x\n $major $minor $patch)随后脚本用sed -i把解析出的版本号与十六进制数值写入include/curl/curlver.h和src/tool_version.hscripts/maketgz并显式声明libversion$version、curlversion$libversion——再次印证libcurl 与 curl 同版本发布的设计。最终脚本依次生成.tar.gz、.tar.bz2、.tar.xz、.zip四种发布压缩包scripts/maketgz压缩包统一命名为curl-$version.*。在构建侧configure.ac 也会从curlver.h中 grep 出字符串版本与数值版本供构建系统与符号版本化使用。五、历史发布记录1996—2026 全量以下是 curl 项目全部公开版本及其发布日期源自 docs/VERSIONS.md 的 Past releases 一节。其中包含重要的命名沿革2.0 之前工具叫httpget4.0 之前叫urlget4.0 起正式命名为curllibcurl与curl始终同步发布、使用相同版本号。8.x 系列2023—8.23.0: 待发布pending8.22.0: 2026-09-028.21.0: 2026-06-248.20.0: 2026-04-298.19.0: 2026-03-118.18.0: 2026-01-078.17.0: 2025-11-058.16.0: 2025-09-108.15.0: 2025-07-168.14.1: 2025-06-048.14.0: 2025-05-288.13.0: 2025-04-028.12.1: 2025-02-138.12.0: 2025-02-058.11.1: 2024-12-118.11.0: 2024-11-068.10.1: 2024-09-188.10.0: 2024-09-118.9.1: 2024-07-318.9.0: 2024-07-248.8.0: 2024-05-228.7.1: 2024-03-278.7.0: 2024-03-278.6.0: 2024-01-318.5.0: 2023-12-068.4.0: 2023-10-118.3.0: 2023-09-138.2.1: 2023-07-268.2.0: 2023-07-198.1.2: 2023-05-308.1.1: 2023-05-238.1.0: 2023-05-178.0.1: 2023-03-208.0.0: 2023-03-207.x 系列2000—20237.88.1: 2023-02-207.88.0: 2023-02-157.87.0: 2022-12-217.86.0: 2022-10-267.85.0: 2022-08-317.84.0: 2022-06-277.83.1: 2022-05-117.83.0: 2022-04-277.82.0: 2022-03-057.81.0: 2022-01-057.80.0: 2021-11-107.79.1: 2021-09-227.79.0: 2021-09-157.78.0: 2021-07-217.77.0: 2021-05-267.76.1: 2021-04-147.76.0: 2021-03-317.75.0: 2021-02-037.74.0: 2020-12-097.73.0: 2020-10-147.72.0: 2020-08-197.71.1: 2020-07-017.71.0: 2020-06-247.70.0: 2020-04-297.69.1: 2020-03-117.69.0: 2020-03-047.68.0: 2020-01-087.67.0: 2019-11-067.66.0: 2019-09-117.65.3: 2019-07-197.65.2: 2019-07-177.65.1: 2019-06-057.65.0: 2019-05-227.64.1: 2019-03-277.64.0: 2019-02-067.63.0: 2018-12-127.62.0: 2018-10-317.61.1: 2018-09-057.61.0: 2018-07-117.60.0: 2018-05-167.59.0: 2018-03-147.58.0: 2018-01-247.57.0: 2017-11-297.56.1: 2017-10-237.56.0: 2017-10-047.55.1: 2017-08-147.55.0: 2017-08-097.54.1: 2017-06-147.54.0: 2017-04-197.53.1: 2017-02-247.53.0: 2017-02-227.52.1: 2016-12-237.52.0: 2016-12-217.51.0: 2016-11-027.50.3: 2016-09-147.50.2: 2016-09-077.50.1: 2016-08-037.50.0: 2016-07-217.49.1: 2016-05-307.49.0: 2016-05-187.48.0: 2016-03-237.47.1: 2016-02-087.47.0: 2016-01-277.46.0: 2015-12-027.45.0: 2015-10-077.44.0: 2015-08-127.43.0: 2015-06-177.42.1: 2015-04-297.42.0: 2015-04-227.41.0: 2015-02-257.40.0: 2015-01-087.39.0: 2014-11-057.38.0: 2014-09-107.37.1: 2014-07-167.37.0: 2014-05-217.36.0: 2014-03-267.35.0: 2014-01-297.34.0: 2013-12-177.33.0: 2013-10-147.32.0: 2013-08-127.31.0: 2013-06-227.30.0: 2013-04-127.29.0: 2013-02-067.28.1: 2012-11-207.28.0: 2012-10-107.27.0: 2012-07-277.26.0: 2012-05-247.25.0: 2012-03-227.24.0: 2012-01-247.23.1: 2011-11-177.23.0: 2011-11-157.22.0: 2011-09-137.21.7: 2011-06-237.21.6: 2011-04-227.21.5: 2011-04-177.21.4: 2011-02-177.21.3: 2010-12-157.21.2: 2010-10-137.21.1: 2010-08-117.21.0: 2010-06-167.20.1: 2010-04-147.20.0: 2010-02-097.19.7: 2009-11-047.19.6: 2009-08-127.19.5: 2009-05-187.19.4: 2009-03-037.19.3: 2009-01-197.19.2: 2008-11-137.19.1: 2008-11-057.19.0: 2008-09-017.18.2: 2008-06-047.18.1: 2008-03-307.18.0: 2008-01-287.17.1: 2007-10-297.17.0: 2007-09-137.16.4: 2007-07-107.16.3: 2007-06-257.16.2: 2007-04-117.16.1: 2007-01-297.16.0: 2006-10-307.15.5: 2006-08-077.15.4: 2006-06-127.15.3: 2006-03-207.15.2: 2006-02-277.15.1: 2005-12-077.15.0: 2005-10-137.14.1: 2005-09-017.14.0: 2005-05-167.13.2: 2005-04-047.13.1: 2005-03-047.13.0: 2005-02-017.12.3: 2004-12-207.12.2: 2004-10-187.12.1: 2004-08-107.12.0: 2004-06-027.11.2: 2004-04-267.11.1: 2004-03-197.11.0: 2004-01-227.10.8: 2003-11-017.10.7: 2003-08-157.10.6: 2003-07-287.10.5: 2003-05-197.10.4: 2003-04-027.10.3: 2003-01-147.10.2: 2002-11-187.10.1: 2002-10-117.10: 2002-10-017.9.8: 2002-06-137.9.7: 2002-05-107.9.6: 2002-04-147.9.5: 2002-03-077.9.4: 2002-03-047.9.3: 2002-01-237.9.2: 2001-12-057.9.1: 2001-11-047.9: 2001-09-237.8.1: 2001-08-207.8: 2001-06-077.7.3: 2001-05-047.7.2: 2001-04-227.7.1: 2001-04-037.7: 2001-03-227.6.1: 2001-02-097.6: 2001-01-267.5.2: 2001-01-047.5.1: 2000-12-117.5: 2000-12-017.4.2: 2000-11-157.4.1: 2000-10-167.4: 2000-10-167.3: 2000-09-287.2.1: 2000-08-317.2: 2000-08-307.1.1: 2000-08-217.1: 2000-08-076.x 系列1999—20006.5.2: 2000-03-216.5.1: 2000-03-206.5: 2000-03-136.4: 2000-01-176.3.1: 1999-11-236.3: 1999-11-106.2: 1999-10-216.1: 1999-10-176.0: 1999-09-135.x 系列1998—19995.11: 1999-08-255.10: 1999-08-135.9.1: 1999-07-305.9: 1999-05-225.8: 1999-05-055.7.1: 1999-04-235.7: 1999-04-205.5.1: 1999-01-275.5: 1999-01-155.4: 1999-01-075.3: 1998-12-215.2.1: 1998-12-145.2: 1998-12-145.0: 1998-12-014.x 系列1998工具正式更名 curl4.10: 1998-10-264.9: 1998-10-074.8.4: 1998-09-204.8.3: 1998-09-074.8.2: 1998-08-144.8.1: 1998-08-074.8: 1998-07-304.7: 1998-07-204.6: 1998-07-034.5.1: 1998-06-124.5: 1998-05-304.4: 1998-05-134.3: 1998-04-304.2: 1998-04-154.1: 1998-04-034.0: 1998-03-20自本版本起工具正式命名为 curl3.x 系列1997—1998工具名为 urlget3.12: 1998-03-143.11: 1998-02-093.10: 1998-02-043.9: 1998-02-043.7: 1998-01-153.6: 1998-01-013.5: 1997-12-153.2: 1997-12-013.1: 1997-11-243.0: 1997-11-012.x 系列1997工具名为 urlget2.9: 1997-10-152.8: 1997-10-012.7: 1997-09-202.6: 1997-09-102.5: 1997-09-012.4: 1997-08-272.3: 1997-08-212.2: 1997-08-142.1: 1997-08-102.0: 1997-08-01自本版本起工具不再叫 httpget1.x 与 0.x 系列1996—1997工具名为 httpget1.5: 1997-07-211.4: 1997-07-151.3: 1997-06-011.2: 1997-05-011.1: 1997-04-201.0: 1997-04-080.3: 1997-02-010.2: 1996-12-170.1: 1996-11-11首个公开版本从以上列表可以直观看到版本号编排规律在历史中的体现1996 年 0.1 起步1997 年进入 1.x2000 年跨入 7.x 并保持长达 23 年2023 年 3 月 20 日同一天先发布 8.0.0主版本递增功能大变更再发布 8.0.1补丁修复此后进入 8.x 时代。六、Rock-solid curl商业长期支持版本除了免费公开的常规发布curl 还设有名为Rock-solid curl的长期支持版本LTS由官方单独管理仅供付费客户使用。这些版本从以往的标准 curl 发布版本拉出分支维护并采用免费版本从未使用过的版本号。历史记录如下源自 docs/VERSIONS.mdRock-solid curl 8.18.1: 2026-02-25Rock-solid curl 8.18.2: 2026-09-02Rock-solid curl 8.14.2: 2026-09-07Rock-solid curl 8.16.1: 2026-09-07Rock-solid curl 8.20.1: 2026-09-07可以看到 Rock-solid 版本在标准版本号上追加了额外的小补丁位如 8.18.1、8.18.2既避免与免费版本号冲突又能在同一主版本线路上持续提供安全与缺陷修复。七、实践建议如何在程序中正确使用版本号结合以上机制给出开发实践要点编译期版本判断优先使用CURL_AT_LEAST_VERSION(major, minor, patch)宏include/curl/curlver.h它是基于LIBCURL_VERSION_NUM的纯整数比较性能与可读性俱佳运行期版本查询调用curl_version_info(CURLVERSION_NOW)获取curl_version_info_data通过其中的version字符串如 8.22.1-DEV、version_num数值如 0x081601以及age字段判断运行环境的实际能力lib/version.c理解三方版本同步curl 命令行工具的CURL_VERSION直接映射自 libcurl 的LIBCURL_VERSIONsrc/tool_version.h因此编译一个版本的 curl 二进制其报告出的 curl/libcurl 版本必然一致发布归档命名所有官方源码压缩包.tar.gz/.tar.bz2/.tar.xz/.zip均以 libcurl 版本号命名格式为curl-version.*由 scripts/maketgz 统一生成并附带 SHA-256 校验值。需要说明的是版本号递增的具体决策何时该动主版本、何时动次版本由 curl 维护团队依据变更规模把握本项目仓库中 docs/VERSIONS.md 是官方对这一规则的最权威文字表述。【免费下载链接】curlA command line tool and library for transferring data with URL syntax, supporting DICT, FILE, FTP, FTPS, GOPHER, GOPHERS, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, MQTT, MQTTS, POP3, POP3S, RTSP, SCP, SFTP, SMB, SMBS, SMTP, SMTPS, TELNET, TFTP, WS and WSS. libcurl offers a myriad of powerful features项目地址: https://gitcode.com/GitHub_Trending/cu/curl创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考