Linux 侧和 Windows 侧最大的差别不是命令,是「依赖要自己装」。
gSOAP 的编译链有八样东西要查,其中最容易被漏的是 openssl-devel——它漏了不报错,
只是悄悄关掉鉴权功能。
08.08 是 08.01 的 Linux 版,同样八步,但每步的坑不一样。 第一步不是敲命令,是查依赖—— 因为 Linux 上「缺一个包」的表现往往不是报错,而是「功能被静默关掉」。
一、八样东西都要查
| 工具 | 干什么 | 缺了会怎样 |
|---|---|---|
gcc |
编译 C | configure 就失败 |
g++ |
编译 gSOAP 的 C++ 部分 | 编到一半失败 |
make |
跑 Makefile | 没得跑 |
bison/flex |
解析器与词法生成 | gSOAP 自己的语法分析器编不出来 |
libssl-dev |
HTTPS 与鉴权 | 静默关掉,不报错 |
第四行最容易忽略:
很多人以为 gSOAP 只是个库,其实它自带语法分析器——soapcpp2 自己就是一个编译器,
而它的源码里用 bison 与 flex 生成的解析器,所以编 gSOAP 需要这两个工具链。
第五行是本节的核心坑:
不装 libssl-dev(CentOS 叫 openssl-devel),configure 不会报错,
它会「静默跳过」HTTPS 与 WS-Security,照常编译成功。
然后你链接业务代码时,soap_wsse_* 一片未定义——回头查编译日志,什么也没有。
二、为什么「静默跳过」这么常见
因为 configure 的设计哲学是「尽量编出能用的东西」:
它把每个可选功能都试一遍,能编就编、不能就跳过,
最后只给一段摘要,不会强调「我跳过了什么」。
| 阶段 | 表现 | 能不能发现 |
|---|---|---|
configure |
一大段输出,ssl 那一行是 no | 要主动看 |
make |
正常完成 | 发现不了 |
| 链接业务代码 | undefined reference to soap_wsse_* |
这时候才知道 |
第一行那句「要主动看」是本节唯一的方法:
configure 跑完必须扫一眼摘要里 OpenSSL 那一项是不是 yes。
第三行暴露问题时,你已经编了十几分钟——而且很容易误判成「代码写错了」。
所以正确顺序是:先查包、再 configure、看摘要、最后 make。
四步里任何一步跳过,都可能在最后一步返工。
三、两个发行版的包名对照
| 需要的东西 | Debian/Ubuntu | CentOS/RHEL |
|---|---|---|
| 编译器与 make | build-essential |
gcc gcc-c++ make |
| OpenSSL 开发包 | libssl-dev |
openssl-devel |
| 解析器生成 | bison flex |
bison flex |
| 压缩与下载 | zlib1g-dev wget |
zlib-devel wget |
第二行两边名字完全不同,这是最容易搞错的一行:
Debian 系叫 libssl-dev,RedHat 系叫 openssl-devel——
照抄另一边的名字,apt 或 yum 会直接说「找不到包」。
这种「找不到包」反而是好事:它当场失败,不静默。
比它危险得多的是「装了个名字像但不是开发包的包」——
比如只装了 openssl(运行库),没装开发包,configure 照样回 no,而你以为装过了。
判断办法:dpkg -l | grep libssl 或 rpm -qa | grep openssl,
看有没有 -dev/-devel 那个。
四、装完还要跑 ldconfig
这一步是 Linux 独有的,Windows 上没有对应概念:
| 做法 | 什么时候要 | 不做的后果 |
|---|---|---|
sudo make install |
编完 | — |
sudo ldconfig |
装到 /usr/local/lib 之后 |
找不到 .so |
第二行是「装完了但用不了」的典型原因:
make install 把库拷到 /usr/local/lib,但系统的库缓存没更新,
于是 wsdl2h 启动时报 error while loading shared libraries。
这个报错很唬人(看起来像没装),实际跑一次 ldconfig 就好了。
替代方案是 export LD_LIBRARY_PATH=/usr/local/gsoap/lib:$LD_LIBRARY_PATH,
但它是「当前 shell 有效」——换个终端窗口就失效,所以更适合临时调试,不适合部署。
五、动手 Demo:Linux 侧第一件事是查依赖
Demo 在本机(Windows)跑一遍 which 探针,
把「八样工具」逐个查一遍——结果全是「没有」,这正好说明为什么这一节只能给清单。
探针代码本身是通用的,拿到 Linux 上跑就是同一份。
# 八样工具逐个查(这段代码在 Linux 上同样能跑)
import shutil
for tool in ("gcc", "g++", "make", "bison", "flex",
"wsdl2h", "soapcpp2", "ldconfig"):
print(tool, shutil.which(tool))
实跑输出:
--------------------------------------------------------------------
Linux 侧第一件事是查依赖
--------------------------------------------------------------------
**第八章后半换到 Linux,因为大部分 ONVIF 服务端跑在 Linux 上。**
**第一件事不是敲命令,是查「工具齐不齐」**:
**gSOAP 的编译链有八样东西要查,缺一个都会在十分钟后以奇怪的方式失败。**
工具 本机 干什么用的
-------------------------------------------------------------
`gcc` **没有** 编译 C
`g++` **没有** 编译 gSOAP 自带的 C++ 部分
`make` **没有** 跑 Makefile
`bison` **没有** **解析器生成(gSOAP 编译要)**
`flex` **没有** **词法分析生成(gSOAP 编译要)**
`wsdl2h` **没有** 生成 onvif.h
`soapcpp2` **没有** 生成框架代码
`ldconfig` **没有** 装完库后刷新缓存
**这一整列「没有」不是我偷懒**——这台机器是 Windows,
**下面三节的内容全部属于「必须在 Linux 上做」,所以我只能给清单和等价物。**
**但「装什么」这件事是能说清的**,而且不同发行版包名不一样:
需要的东西 Debian/Ubuntu CentOS/RHEL
-----------------------------------------------------------------
编译器 `build-essential` `gcc gcc-c++ make`
**OpenSSL 开发包** `libssl-dev` **`openssl-devel`**
解析器生成 `bison flex` `bison flex`
压缩与下载 `zlib1g-dev wget` `zlib-devel wget`
**第二行是所有人都会踩的坑**:
**不装 OpenSSL 开发包,gSOAP 的 `configure` 不会报错**,
**它会「静默跳过」HTTPS 与 WS-Security 支持**,照常编译成功。
**然后在链接业务代码时,`soap_wsse_*` 一片未定义。**
**这时候回头查编译日志,会发现根本没有相关报错**——
**因为那一整块功能在配置阶段就被关掉了。**
**判断办法很简单**:**`configure` 跑完,回头看它的汇总输出里有没有 openssl。**
**没有就说明漏了**,别急着 `make`。
八行全是 None,因为这台机器是 Windows。
这不是「演示失败」,而是这一节诚实的边界:08.08 整章的内容都属于「必须在 Linux 上做」。
注意 ldconfig 也在探针里:它不是编译工具,是「装完之后刷缓存」,
但它是「装完能不能用」的关键一步,所以也在清单里。
这段代码在 Linux 上会打出路径(比如 /usr/bin/gcc),
而「有没有路径」就是判断「装没装」的最快办法——
比 gcc --version 快,而且不会因为「装了但没配好」而误判。
最后那张包名对照表的价值在于「两边名字不同」:
照着另一边的名字装,包管理器会直接说找不到——那种失败反而是好事,不静默。
30 秒实验
- 在 Linux 上跑这段探针,看八样里缺几样。
- 跑
dpkg -l | grep -i ssl,看有没有-dev那个包。 - 试着不装
bison直接./configure,看它报什么(提示:会明确说要 bison)。
常见误区
- 只装
openssl不装openssl-devel。 运行库和开发包是两个包, 只装前者configure照样回 no。 configure跑完不看摘要。 它跳过了什么不会大声说,只在摘要那一行写个no。make install之后不跑ldconfig。 表现是error while loading shared libraries, 看起来像没装,其实只是库缓存没更新。
自测三问(点开对答案)
1. 为什么必须装 `libssl-dev` 而不只是 `openssl`? —— **因为 `openssl` 是运行库,`libssl-dev` 才是开发包**(头文件 + 链接文件)。 没有开发包,`configure` 检测不到,就直接跳过 SSL 支持。 2. `configure` 静默跳过 SSL 会有什么后果? —— **`make` 正常完成、看起来一切正常**, **但链接业务代码时报 `undefined reference to soap_wsse_*`**——要重新 `configure` 并清理缓存。 3. 为什么 `make install` 之后要跑 `ldconfig`? —— **因为库装在 `/usr/local/lib`,系统库缓存没更新**,运行时找不到 `.so`。下一节挑源码包:为什么教材用 2.8.116,以及这件事本机做不了的原因。
- ☐ (本节完,下一节 08.08.02 下载gSOAP-2.8.116的源码)