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 秒实验
- 在 Linux 上跑
./configure --help | grep ssl,看有哪些 ssl 相关选项。 - 编完之后跑
ldd wsdl2h,看它依赖哪些库、有没有not found。 - 把
-j调到-j8试一次,看你的机器会不会 OOM。
常见误区
- 漏了
--enable-ssl。 不报错,只是不编鉴权那块,链接业务代码时才炸。 - 补装包后直接再跑
./configure。config.cache会让它继续回 no, 要先删缓存或make clean。 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 侧只有一个新问题——换行符。
- ☐ (本节完,下一节 08.08.04 修改typemap.dat)