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

Linux 装源码就三步:configure、make、make install。 而 gSOAP 的三个参数里,--enable-ssl 漏了不会报错—— 它只是不编那块代码,等你链接业务代码时才发现。

📝 本节和前面几节的关系

上一节拿到源码包,这一节把它编成两个可执行文件。 这是 08.08 里唯一「必须真在 Linux 上做」的步骤, 也是本课唯一完全靠文档、没有实测的一段。

一、三步与三个参数

命令 作用 漏了会怎样
./configure --prefix=… 生成 Makefile 没 Makefile
--enable-ssl 编进 HTTPS 与鉴权 静默跳过,不报错
make -j4 编译 —
sudo make install 装到 prefix bin/ 里没东西

第二行是本节的核心:--enable-ssl 漏了,configure 照样成功,make 照样完成, 只是 wsse 那一块功能没有被编进去。 而 wsse 就是 ONVIF 鉴权要用的东西—— 所以「代码写得对、库也编了,就是链接不上 soap_wsse_*」 这个经典问题,根子在这一行。 第一行那个 --prefix 也值得说:不写就装到 /usr/local, 而很多发行版的包管理器也往那里装东西——两者混在一起,以后很难分清哪个是哪个。 所以我习惯装到 /usr/local/gsoap 这种独立目录。

二、configure 的缓存会让重试失效

这是一个很容易踩的坑:configure 会把检测结果写进 config.cache, 于是「补装了 ssl 再跑一次」不会生效——它直接读缓存,还是 no。

做法 结果 正确做法
补装包后直接再 ./configure 还是 no 先删缓存
./configure --enable-ssl 可能还是 no make clean 或删 config.cache
rm config.cache && ./configure … 重新检测 这是对的

第一行那个「还是 no」会让人怀疑「我到底装没装」, 于是反复 apt install——而问题根本不在包装没装,在缓存。 第二行那个 make clean 是「保底手段」:它清掉的不只是缓存,还有之前编了一半的目标文件。 改过 configure 参数之后重编,make clean 是必须的——否则可能链接到旧的目标文件。 这个坑和 08.01.05 那个「先改 typemap 再生成」是同一种性质:流程里有一个「不可逆的顺序」, 顺序错了就得从头来。

三、-j 太大会 OOM

make -j4 是「四路并行」, 很多人喜欢写 -j16 图快——而 gSOAP 的某些源文件很大,编译时内存占用不低:

现象 真实原因 怎么办
internal compiler error 内存不够,编译器自己崩了 降到 -j1
Killed 被 OOM killer 杀掉 同上
编译突然中断无报错 多半也是内存 看 dmesg 末尾

三行看着都像「代码有问题」,其实都是「机器不够用」。 internal compiler error 这个报错特别误导人—— 它字面意思是「编译器内部错误」,而实际上 99% 的情况是内存不足导致的。 所以小内存机器(1~2 GB)用 -j1 更稳:慢一点,但不会在编了十分钟后崩掉重来。 第三行那个「突然中断无报错」要看 dmesg:OOM killer 的日志在那里, 它会写清楚「杀了哪个进程、因为内存」——这是唯一能确认「是不是内存问题」的证据。

四、编完之后要看到什么

成功的标志不是「没有报错」,是「两个可执行文件出现在 bin/ 里」:

文件 用途 怎么验
bin/wsdl2h 生成 onvif.h ./wsdl2h -h 打帮助
bin/soapcpp2 生成框架代码 ./soapcpp2 -h
lib/libgsoap.so 运行时库 ldd wsdl2h 能查到

第三列那个「打帮助」是最快的验证: 能打出用法说明,说明「可执行 + 动态库都能加载」—— 如果缺库,会在这一步就报 error while loading shared libraries。 第二行那个 soapcpp2 -h 还顺便能看它支持哪些参数:不同版本的参数有增减, 看完就知道书上写的那几个参数在这个版本里还在不在。 第三条那个 ldd 是 Linux 独有工具:它列出「这个程序依赖哪些 .so、找到没找到」, not found 那几行就是缺的东西。 这比猜快得多,也是 Linux 排查的必备动作。

五、动手 Demo:编译 gSOAP 的三个参数

这一节没有 Demo 输出:本机没有 gcc,也没有 Linux。 能做的是把「三个参数 + 三个坑」列成可核对的表,以及说清「成功长什么样」。

# 本节没有可跑的代码:本机无 gcc/make
# 标准三步(在有 gcc 的 Linux 上)
# ./configure --prefix=/usr/local/gsoap --enable-ssl
# make -j2 && sudo make install
# sudo ldconfig
print("no data: 本机无编译环境")

实跑输出:

--------------------------------------------------------------------
编译 gSOAP 的三个参数
--------------------------------------------------------------------
**Linux 上装源码的标准三步,gSOAP 也一样**:

  `./configure --prefix=/usr/local/gsoap --enable-ssl`
  `make -j4`
  `sudo make install`

**三个参数各有各的后果**:

  参数               作用                              漏了会怎样
  ---------------------------------------------------------------------------------------------
  `--prefix`         **装到哪**                        默认 `/usr/local`,**可能与系统包冲突**
  `--enable-ssl`     **编进 HTTPS 与 WS-Security**     **鉴权功能编不出来**
  `-j4`              并行编译                          慢,但不会错

**第二行是「静默失败」的源头**:
**不写 `--enable-ssl`,`configure` 也不会提醒你**,
**它只是不编那块代码。**
**等你 `soapcpp2` 生成完、编译业务代码时,才会发现 `wsse` 相关的函数全没有。**
**这时候回头补 `--enable-ssl`,还得先 `make clean` 重来一遍**——
**因为 `configure` 的缓存(`config.cache`)会把「没有 ssl」这个结论记住。**
**所以顺序很重要**:**先确认 `configure` 的输出里 ssl 是 yes,再 `make`。**

**第三行那个「慢但不会错」也要说清楚**:
**`-j` 太大反而会失败**(内存不够时 g++ 被 OOM killer 杀掉),
**表现是 `internal compiler error` 或 `Killed`**,
**看着像代码有错,其实是内存不够。**
**小内存机器(1 GB)用 `-j1` 更稳。**

又是「一行 print」的 Demo:这是本节诚实边界的标志。 注意 -j2 而不是 -j4:因为「越大越快、越大越容易 OOM」, 不确定内存多大时,小一点更稳。 最后那句 sudo ldconfig 经常被忘: 它不在「三步」里,但少了它,wsdl2h 启动时找不到 .so。 这一节的内容全部来自官方文档与通用 Linux 经验,没有本机实测—— 这一点在正文里已经写明,读者不会误以为「作者跑过」。

30 秒实验

  1. 在 Linux 上跑 ./configure --help | grep ssl,看有哪些 ssl 相关选项。
  2. 编完之后跑 ldd wsdl2h,看它依赖哪些库、有没有 not found。
  3. 把 -j 调到 -j8 试一次,看你的机器会不会 OOM。

常见误区

  1. 漏了 --enable-ssl。 不报错,只是不编鉴权那块,链接业务代码时才炸。
  2. 补装包后直接再跑 ./configure。 config.cache 会让它继续回 no, 要先删缓存或 make clean。
  3. make -j 开很大。 内存不够会 internal compiler error 或 Killed, 看着像代码有问题,其实是机器不够用。
自测三问(点开对答案) 1. `--enable-ssl` 漏了会怎样? —— **`configure` 和 `make` 都正常完成**,只是没编 SSL 与 WS-Security 那块。 **链接业务代码时报 `soap_wsse_*` 未定义。** 2. 为什么补装了包还要删 `config.cache`? —— **因为 `configure` 会把检测结果缓存下来**,再跑一次它直接读缓存,还是 `no`。 3. 怎么确认 gSOAP 编好了? —— **`bin/wsdl2h` 和 `bin/soapcpp2` 存在**,并且 `./wsdl2h -h` 能打出帮助。 能打帮助说明动态库也加载成功了。

下一节回到 typemap.dat:Linux 侧只有一个新问题——换行符。

相关笔记