📹 第八章 ONVIF框架代码案例应用
📄 一句话概括

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 秒实验

  1. 在 Linux 上跑这段探针,看八样里缺几样。
  2. 跑 dpkg -l | grep -i ssl,看有没有 -dev 那个包。
  3. 试着不装 bison 直接 ./configure,看它报什么(提示:会明确说要 bison)。

常见误区

  1. 只装 openssl 不装 openssl-devel。 运行库和开发包是两个包, 只装前者 configure 照样回 no。
  2. configure 跑完不看摘要。 它跳过了什么不会大声说,只在摘要那一行写个 no。
  3. 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,以及这件事本机做不了的原因。

相关笔记