编 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 秒实验
- 在有 gcc 的机器上跑这段探针,看缺哪几项。
- 把
yum install换成dnf install(CentOS 8 之后),看包名要不要改。 - 跑完
make install后故意不跑ldconfig,写个最小程序链接-lgsoap,看报什么错。
常见误区
- 以为
configure成功就等于功能齐了。 缺 openssl 时它静默跳过, 必须在末尾摘要里看OpenSSL: yes/no。 - 以为装了
openssl就有 HTTPS。 要的是openssl-devel,那是两个包。 - 以为
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 就完事,
但坑挪到了「装包版和自编版的路径不同」。
- ☐ (本节完,下一节 06.02.04 Ubuntu编译gSOAP)