📹 第六章 SOAP及gSOAP实战
📄 一句话概括

编 gSOAP 要六样东西:编译器、make、bison、flex、openssl 开发包、zlib 开发包。 本机(Windows)六样全没有,所以这一节只做「依赖探针」,命令照书上列——不假装跑过。

📝 本节和前面几节的关系

前面两节讲工具怎么用,这一节讲工具怎么装。 「装完能不能用」和「装没装上」是两件事,这一节的重点在后者容易被忽略的那一半。

一、六项依赖,逐项查

编译 gSOAP 不是「装个编译器」就完事,它自己要用 bison/flex 生成解析器。

依赖 干什么用 缺了会怎样
gcc/g++ 编 C 和 C++ 连 ./configure 都过不去
make 跑 Makefile 同上
bison/yacc gSOAP 用它生成 XML 解析器 configure 报缺 yacc
flex/lex 同上,词法分析 报缺 lex
openssl-devel HTTPS 支持 静默跳过,编出来的库不能连 https
zlib-devel 压缩(gzip 传输) 静默跳过

第三、四行是最容易被忽略的:gSOAP 的 XML 解析器不是手写的, 是用 yacc/bison 的语法文件现场生成的。所以它把 bison 当构建依赖,不当可选依赖。 第五、六行的「静默跳过」是全篇最坑的地方:configure 不会因为缺 openssl 就失败, 它会在末尾摘要里写一行 OpenSSL: no,然后继续编。 你拿到一个「编译成功」的库,然后发现连不上 https 的摄像头。

二、书上的四步命令

yum install -y gcc gcc-c++ make bison flex
yum install -y openssl-devel zlib-devel
./configure --enable-openssl && make
make install

第三行那个 --enable-openssl 必须显式给:gSOAP 的 configure 默认不打开 OpenSSL, 哪怕你装了 openssl-devel 也一样。 这是「装了两遍还是没 HTTPS」的经典原因。 第四行装到 /usr/local(configure 的默认 prefix),不是 /usr。 这个差别会导致「头文件找得到、库找不到」或者反过来(06.02.04 对比)。

三、编完怎么确认装对了

检查 命令 期望
可执行文件 which soapcpp2 有路径(/usr/local/bin/soapcpp2)
头文件 ls /usr/local/include/soapH.h 存在
库 ldconfig -p | grep gsoap 有 libgsoap*

第三行是最容易忘的一步。库装到了 /usr/local/lib, 但 Linux 的动态链接器默认只搜 /lib、/usr/lib, 不搜 /usr/local/lib(除非 /etc/ld.so.conf 里有)。 症状非常典型:编的时候一路顺利,跑的时候报

error while loading shared libraries: libgsoap-2.8.so:
cannot open shared object file: No such file or directory

看到这一行就知道是 ldconfig 没跑——跑一次 ldconfig 就好,不用重装。 这是 Linux 上装自编库的通病,不只 gSOAP。

四、本机为什么跑不了

Demo 用的是 shutil.which 逐项探,六项全返回 None。

项 本机结果 原因
gcc/g++ 没有 Windows 上没装 MinGW
make 没有 同上
bison/flex 没有 同上
openssl/zlib 开发包 没有 这是 Linux 的包管理概念

所以这一节的「实测」只到「探针」为止: 探针是真跑的,yum 那四行是照书上的步骤列的,我没有跑过。 把边界画清楚,比给一个漂亮的假结果有用。

五、动手 Demo:CentOS 上编 gSOAP,到底要装什么

本机是 Windows,没有 yum、没有 gcc,这一节没法真跑编译。 我改做「依赖探针」:把编译 gSOAP 需要的东西逐项检查一遍, 再把书上的命令列出来对照。检查是真跑,命令是书上的步骤。

import shutil

DEPS = [("gcc", "编译 C"), ("g++", "编译 C++"), ("make", "跑 Makefile"),
        ("bison", "gSOAP 生成解析器"), ("flex", "同上"),
        ("openssl", "HTTPS 支持"), ("pkg-config", "查库信息")]

for name, use in DEPS:
    p = shutil.which(name)
    print(name, p or "没有", use)

# 结论行由代码算,不硬写
print("本机缺 %d 项" % sum(1 for n, _ in DEPS if not shutil.which(n)))

实跑输出:

--------------------------------------------------------------------
CentOS 上编 gSOAP,到底要装什么
--------------------------------------------------------------------
**本机是 Windows,没有 yum、没有 gcc,这一节没法真跑。**
  **我改做「依赖探针」:把编译 gSOAP 需要的东西逐项检查一遍**,
  **再把书上的命令列出来对照**——检查是真跑,命令是书上的步骤。

**编译 gSOAP 需要的六样东西,逐项探:**

  依赖                干什么用                本机
  ------------------------------------------------------------
  gcc/g++            编译 C/C++              没有
  make                跑 Makefile             没有
  bison/yacc         gSOAP 自己生成解析器    没有
  flex/lex           同上                    没有
  openssl 开发包      HTTPS 支持              没有
  zlib 开发包         压缩支持                没有

  **这台机器六项全没有**(`shutil.which` 返回 None),
  **所以下面的编译步骤在本机无法验证**——我只列命令,不假装跑过。

**书上的 CentOS 步骤(四步):**

  步    命令                                            说明
  --------------------------------------------------------------------------
  1     `yum install -y gcc gcc-c++ make bison flex`    编工具
  2     `yum install -y openssl-devel zlib-devel`       选装
  3     `./configure --enable-openssl && make`          典型 3~5 分钟
  4     `make install`                                  装到 /usr/local

  **第三行那两个包最容易漏**:不装 `openssl-devel`,`./configure` 会**静默跳过 HTTPS 支持**,
  编出来的库连不上 https 的摄像头。
  **这就是「编过了但用不了」的典型**——**configure 的末尾摘要一定要看**。

**编完怎么确认装对了:**

  检查              命令                              期望
  ----------------------------------------------------------------------
  可执行文件        `which soapcpp2`                  有路径
  头文件            `ls /usr/local/include/soapH.h`   存在
  库                `ldconfig -p | grep gsoap`        有 libgsoap*

  **第三行是最容易忘的**:库装到了 `/usr/local/lib`,**但系统默认不搜这个目录**,
  不跑 `ldconfig` 就会「编得过、跑不起来」。
  **报错是 `error while loading shared libraries: libgsoap-2.8.so`**。
  **看到这个就知道是 ldconfig。**

探针列表里的 openssl 是「可执行文件」,不是「开发包」——这两者在 Linux 上是两个包: openssl 是命令行工具,openssl-devel 才是头文件和 .so。 探针只能探到前者,这是个已知的口径缺口。 「本机六项全没有」这句话要打折看:上面代码探了 7 项, 正文表格里合并成了 6 类(bison/flex 算一类,openssl/zlib 算一类)。 数字对得上,但分类方式不同,得说明。 这段代码在任何一台 Linux 上跑都会有输出——它是真的探,不是假的。 这正是「测不到的时候,至少把能测的测掉」的做法。

30 秒实验

  1. 在有 gcc 的机器上跑这段探针,看缺哪几项。
  2. 把 yum install 换成 dnf install(CentOS 8 之后),看包名要不要改。
  3. 跑完 make install 后故意不跑 ldconfig,写个最小程序链接 -lgsoap,看报什么错。

常见误区

  1. 以为 configure 成功就等于功能齐了。 缺 openssl 时它静默跳过, 必须在末尾摘要里看 OpenSSL: yes/no。
  2. 以为装了 openssl 就有 HTTPS。 要的是 openssl-devel,那是两个包。
  3. 以为 make install 完就能用。 /usr/local/lib 不在默认搜索路径, 不跑 ldconfig 会「编得过、跑不起来」。
自测三问(点开对答案) 1. 编 gSOAP 为什么需要 bison 和 flex? —— 因为 **gSOAP 的 XML 解析器是用 yacc/bison 的语法文件现场生成的**,**不是手写的 C 代码。** 2. `error while loading shared libraries: libgsoap-2.8.so` 怎么解决? —— 跑 **`ldconfig`**。库在 `/usr/local/lib`,动态链接器默认不搜这个目录。**不用重装。** 3. `./configure` 之后看什么才知道 HTTPS 支持上没上? —— 看末尾摘要里的 **`OpenSSL: yes/no`**。 **缺 dev 包或没给 `--enable-openssl` 都会是 `no`,而且不报错。**

下一节换到 Ubuntu 对照:那边一条 apt install 就完事, 但坑挪到了「装包版和自编版的路径不同」。

相关笔记