📹 第九章 SIP及eXosip开源库应用
📄 一句话概括

Linux 侧一条 ./configure 加四个参数,编两遍就完了——但最后那行 ldconfig 不能省。 --enable-openssl 是最容易漏的一个:漏了不报错,只是 sips: 静默失效。

📝 本节和前面几节的关系

09.02.02 讲了 Windows 的三个库,这一节是同一件事的 Linux 版。 08.08.01 到 08.08.03 讲 gSOAP 的 Linux 编译,这里的坑几乎一模一样: 可选依赖默认关、装完要刷缓存。

一、四个参数

参数 作用 不加会怎样
--prefix 装到哪 装到 /usr/local
--disable-static 不生成 .a 两份都生成
--enable-openssl 支持 TLS 只有明文 SIP
--disable-tools 不编示例 多几个可执行

第三行是唯一「不加也不报错」的: configure 会把 openssl 探一遍,找不到就跳过、照常往下走—— 最后给一段摘要,openssl: no 藏在里面。 这和 gSOAP 那边一模一样:两个库都是「可选功能默认关、关了就静默降级」的脾气。 所以 Linux 上装库有一条铁律:configure 跑完必须扫一眼摘要,别直接 make。

二、两遍编译

cd libosip2-5.3.0
./configure --prefix=/usr/local && make && sudo make install
cd ../libexosip2-5.3.0
./configure --prefix=/usr/local && make && sudo make install
sudo ldconfig

两遍的 --prefix 必须一致:第二遍要靠第一遍装的头文件与库, prefix 不同就会「找不到 osip2」。 最后那行 ldconfig 是刷动态库缓存: 不跑的话,编译能过、运行时却报「找不到 libexosip2.so」。 这个错很容易误判成「库没装上」, 其实 ls /usr/local/lib 能看到文件——只是加载器没索引到它。

三、用 pkg-config 验证

装完不要靠「猜」有没有成功,用 pkg-config 问它:

pkg-config --cflags --libs libexosip2

它会打出一行参数,形如 -I/usr/local/include -L/usr/local/lib -lexosip。 这一行直接抄进 Makefile 就行,不用手写路径。 返回空或者报「未找到」,说明 .pc 文件没装到 pkg-config 的搜索路径里。 看 PKG_CONFIG_PATH 这个环境变量, 默认只有 /usr/lib/pkgconfig 与 /usr/share/pkgconfig, /usr/local/lib/pkgconfig 常常不在里面。

四、和 gSOAP 那套对照着看

步骤 gSOAP(08.08) oSIP/eXosip
查依赖 八样工具 openssl-dev
配置 ./configure ./configure
编译安装 make && make install 同样两遍
收尾 ldconfig ldconfig

第一行 gSOAP 要八样、这里只要一样,因为 oSIP 是零依赖的(除了可选的 openssl)。 这是 oSIP 的可爱之处:源码包小、依赖少、编起来快。 第四行两边完全一样:Linux 装库永远是「装、刷缓存、验」三步, 少了第二步的报错最像「没装上」。 所以「装完立刻 ldconfig」应该变成肌肉记忆,别等到运行时报错才想起来。

五、本机探针与边界

本机是 Windows,所以这两个命令都查不到:

命令 本机
pkg-config 无
ldconfig 无

这又一次说明「08.08 与 09.02 两章都属于必须在 Linux 上做的活」。 本机能做的是「把流程写准、把坑标清」,不能做的是「给你看编译日志」。 这条边界值得反复强调,因为最容易出的错就是「看着别人写的日志以为自己做过了」。

六、动手 Demo:Ubuntu 下 configure 的四个参数

Demo 把四个参数列清楚,再把两遍编译的命令摆出来。 最后探一遍 pkg-config 与 ldconfig,证明这一节的上限在哪。

import shutil
for tool in ("pkg-config", "ldconfig", "gcc", "make"):
    print(tool, shutil.which(tool))

实跑输出:

--------------------------------------------------------------------
Ubuntu 下 configure 的四个参数
--------------------------------------------------------------------
**Linux 侧走 autotools,一条 `./configure` 加四个参数**:

  参数                   作用                不加会怎样
  -------------------------------------------------------------
  `--prefix`             装到哪              装到 `/usr/local`
  `--disable-static`     **不生成 `.a`**     动态库也照生成
  `--enable-openssl`     **支持 TLS**        **只有明文 SIP**
  `--disable-tools`      不编示例            多编几个可执行

**第三行是最容易漏的**:**不加 `--enable-openssl`,`sips:` 就用不了**,
**而 `configure` 不会提醒你「你要的 TLS 没开」。**
**这和 08.08.01 讲 gSOAP 时的坑一模一样**:
**可选功能默认关,关了就静默降级**——**两个库都是这个脾气。**

**编译顺序和 Windows 一样,只是命令形式不同**:

  ./configure --prefix=/usr/local && make && sudo make install
  cd ../libexosip2-5.3.0
  ./configure --prefix=/usr/local && make && sudo make install
  sudo ldconfig

**最后那行 `ldconfig` 不能省**——**它刷新动态库缓存**,
**不跑的话编译能过、运行时却报「找不到 libexosip2.so」。**
**这和 08.08.01 那节结尾讲的是同一件事**:**Linux 装库有三步——装、刷缓存、验。**

**本机探针**:`pkg-config` 与 `ldconfig` 的查询结果——

  命令             本机
  ------------------------
  `pkg-config`     **无**
  `ldconfig`       **无**

**两个都没有**,因为这台机器是 Windows。
**装完之后可以用 `pkg-config --cflags --libs libexosip2` 验证**,
**它会把头文件路径和链接参数一起打出来**——**这两行直接抄进 Makefile 就行,不用手写。**

四个全是「无」,因为这台机器是 Windows。 但注意 gcc 与 make 也一起查了——这两个是「能不能编」的第一道门, 而 pkg-config 与 ldconfig 是「装完能不能用」的第二道门。 两道门的顺序不能反:先确认能编,再关心装好没装好。 反过来会浪费时间——在没装 gcc 的机器上调 pkg-config 半天,一点意义都没有。 那四个参数里真正需要记的只有 --enable-openssl: 其余三个都是「不改也能用」,只有它是「不改就少一项功能」。

30 秒实验

  1. 在 Ubuntu 上跑 ./configure --help | grep openssl,看默认值是什么。
  2. 故意不跑 ldconfig,然后编译一个小程序,看报什么错。
  3. 把 PKG_CONFIG_PATH 加上 /usr/local/lib/pkgconfig 再查一次。

常见误区

  1. configure 跑完直接 make。 必须看一眼摘要,openssl: no 藏在一大段输出里, 漏了就静默降级。
  2. 装完不跑 ldconfig。 运行时报「找不到 .so」,而文件其实在,只是加载器没索引到。
  3. 两遍 --prefix 给不一样的值。 第二遍找不到 osip2,因为头文件与库装到了两个地方。
自测三问(点开对答案) 1. 四个参数里哪个「不加也不报错」? —— **`--enable-openssl`**。`configure` 探不到就跳过,照常编译成功,只是 `sips:` 用不了。 2. 两遍编译为什么 `--prefix` 必须一致? —— **第二遍要靠第一遍装的 `osip2/osip.h` 与 `libosip2.so`**,prefix 不同就找不到。 3. `ldconfig` 不跑会怎样? —— **编译能过、运行报「找不到 libexosip2.so」**。 文件在 `/usr/local/lib` 里,但动态加载器的缓存没更新。

下一节真正写一个 UAC 与 UAS——四步就能跑通一通电话。

相关笔记