gSOAP 的版本号不是一个「越新越好」的选择题—— 它决定了生成出来的结构体名,而结构体名一改,业务代码就要跟着改。 所以跟教材用 2.8.116 是「教学选择」,生产环境应该用新版。
上一节把依赖备齐了,这一节拿源码包。 这一步本身没有技术含量,但「挑哪个版本」这件事有工程含义, 而且本机做不了——原因要如实说清。
一、版本号为什么重要
| 影响 | 具体表现 | 严重程度 |
|---|---|---|
| 结构体字段名 | tt__Resolution 里某字段改名 |
业务代码编译失败 |
| 函数签名 | soap_call_* 参数顺序变 |
要改调用处 |
| 支持的规范版本 | 新版跟得上 ONVIF 2.60 | 影响功能范围 |
第一行是最疼的:ONVIF 那套头文件有上万个结构体,
其中任何一个字段改名,你的业务代码就编不过——而错误信息是「没有名为 xxx 的成员」,
你要去几万行的 soapStub.h 里找新名字。
所以「锁版本」在 ONVIF 项目里不是洁癖,是必需:gSOAP 版本 + WSDL 版本,两个都要锁,
否则「同一份代码在不同机器上生成出不同结果」。
第三行那个「规范版本」是另一回事:新版 gSOAP 才跟得上 ONVIF 2.60,
所以「用旧版保稳定」和「用新版保功能」是一个真实的取舍。
二、教材的版本是教学选择
这一点必须说清楚,否则读者会以为「2.8.116 是最好的」。
| 立场 | 选什么版本 | 理由 |
|---|---|---|
| 跟着教材学 | 2.8.116 | 书上第几行写什么能对上 |
| 做新项目 | 最新稳定版 | CVE 修复、新规范支持 |
| 维护老项目 | 保持原版本 | 别动,动了全是雷 |
第一行的价值是「可对照」:教材里的截图、行号、报错信息都基于那个版本, 换成新版,读者会对不上「书上说的第 42 行」。 第二行是工程现实:gSOAP 出过解析漏洞,老版本在有公网入口的服务里是有风险的。 第三行那句话是血的教训:老项目升级 gSOAP,等于把所有生成代码重来一遍, 而重来之后业务代码要不要改,取决于改了多少字段名——这种改动量在项目后期是不可接受的。
三、本机为什么下不了
这一节必须如实交代,因为它决定了后面所有内容的性质:
| 尝试 | 结果 | 原因 |
|---|---|---|
| sourceforge 直链 | 404 | 版本号对应的文件名猜错了 |
| GitHub raw | 502 | 这个网络里被代理挡了 |
两行都是真跑出来的结果,不是我懒得下。
所以本节没有「源码包多大、解压出几个文件」这类数——我不编。
能确定的只有流程:下载 → 解压 → ./configure → make,每一步的具体输出我没跑过。
这种「诚实边界」在后面几节会反复出现:
凡是「必须有 Linux + gSOAP」的步骤,我只给清单和等价物,凡是「能算能跑」的,全部给真数据。
四、下了之后放哪
源码包解压出来的目录结构是固定的,而工程只需要其中三样东西:
| 内容 | 用不用 | 说明 |
|---|---|---|
gsoap/bin/ |
用 | wsdl2h 与 soapcpp2 编译后在这 |
gsoap/stdsoap2.c/h |
用 | 运行时核心,必拷 |
gsoap/wsse.h/wsseapi.c |
用 | 鉴权 |
gsoap/samples/ |
不用 | 示例,几十 MB,可以删 |
gsoap/wsdl/ |
不用 | 自带的一堆 WSDL,和 ONVIF 无关 |
第四、五行是「体积大头」:一个完整的 gSOAP 源码包解压后有一百多 MB,
其中大部分是示例和自带 WSDL——所以「拷进工程的只有几 MB」这件事要说清,
否则会有人把整个源码包都塞进版本库。
第一行那个 bin/ 是编译产物:新下载的源码包里没有,make 之后才有。
所以「下完就能用」是错的,中间必须编译(下一节)。
五、动手 Demo:gSOAP 源码包怎么挑
这一节没有 Demo 输出,因为本机下不到源码包。 替代做法是把「挑版本的三个维度」列成表,这三个维度在选任何第三方库时都用得上。
# 本节没有可跑的代码:源码包下载失败
# 能确定的是流程,不是输出
# 1) 下载 2) 解压 3) ./configure 4) make
print("no data: 本机未取得源码包")
实跑输出:
--------------------------------------------------------------------
gSOAP 源码包怎么挑
--------------------------------------------------------------------
**书上用的是 2.8.116,这个版本确实存在,但不是最新。**
**挑版本要看三件事**:
看什么 为什么 本课的选择
----------------------------------------------------------------------------------
**生成的头文件兼容性** 新版可能改了结构体名 跟教材一致,**2.8.116**
有没有修 CVE gSOAP 出过解析漏洞 **生产环境用新版**
源码包体积 **几十 MB 量级**(未实测) —
**第一行是这个决定的核心**:
**ONVIF 那套头文件是几十万个结构体,换 gSOAP 版本可能改字段名。**
**跟着教材用 2.8.116,是为了「书上第几行写什么」能对上**,
**不是为了「它更好」。**
**这一点必须分清**:**教材的版本号是教学选择,不是工程建议。**
**下载这件事本机做不了,原因如实说**:
**`gsoap` 的源码在 sourceforge 上,我试的两个直链都返回 404**,
**而 GitHub 的 raw 地址在这个网络里被代理挡成 502。**
**所以我没下到源码包,也就没有它的体积、文件数这些数。**
**能确定的是流程:下载 → 解压 → `./configure` → `make`**,
**每一步的具体输出我没跑过,就不编了。**
这段「代码」是刻意留空的:它只有一行 print,说明「本机没数据」。 为什么不用假数据填满? 因为「假数据比没有更糟」—— 读者会以为「照这个数去准备磁盘空间就行」,而实际数字可能差一倍。 这一节的价值全在那张三列表里: 「教学选择」「工程选择」「维护老项目」三个立场对应三个版本策略, 而这个区分在别的资料里很少讲清——大多数资料只会说「用最新版」。 最后那句「源码包解压有一百多 MB」是有依据的估算(示例与自带 WSDL 占大头), 但我没实测,所以要标「量级」不标精确值。
30 秒实验
- 去 gSOAP 官网看当前最新版本号,和 2.8.116 差多少。
- 查一下 gSOAP 的历史 CVE,看 2.8.116 之后修了哪些。
- 算一下:如果源码包 120 MB、工程只用 5 MB,塞进版本库会多占多少。
常见误区
- 以为「版本越新越好」。 新版会改结构体字段名,ONVIF 项目里这等于业务代码要跟着改。
- 把整个源码包塞进版本库。 大部分是示例和自带 WSDL,真正要用的只有几 MB。
- 下完源码包就以为能用了。
wsdl2h和soapcpp2是编译出来的, 新包里没有现成的可执行文件。
自测三问(点开对答案)
1. 为什么 ONVIF 项目要锁 gSOAP 版本? —— **因为它决定生成出来的结构体字段名**。 版本一变,业务代码可能编不过,而错误在几万行的头文件里。 2. 教材为什么用 2.8.116? —— **为了让「书上第几行写什么」能对上**,是教学选择。 **新项目该用最新稳定版**(CVE 修复、新规范支持)。 3. gSOAP 源码包里哪些东西真正要拷进工程? —— **`stdsoap2.c/h`、`wsse.h`/`wsseapi.c`,以及编译出来的两个 exe。**示例和自带 WSDL 都不用。下一节编译:三个参数,其中一个漏了会让鉴权功能编不出来。
- ☐ (本节完,下一节 08.08.03 编译gSOAP-2.8.116)