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 秒实验
- 在 Ubuntu 上跑
./configure --help | grep openssl,看默认值是什么。 - 故意不跑
ldconfig,然后编译一个小程序,看报什么错。 - 把
PKG_CONFIG_PATH加上/usr/local/lib/pkgconfig再查一次。
常见误区
configure跑完直接make。 必须看一眼摘要,openssl: no藏在一大段输出里, 漏了就静默降级。- 装完不跑
ldconfig。 运行时报「找不到 .so」,而文件其实在,只是加载器没索引到。 - 两遍
--prefix给不一样的值。 第二遍找不到 osip2,因为头文件与库装到了两个地方。
自测三问(点开对答案)
1. 四个参数里哪个「不加也不报错」? —— **`--enable-openssl`**。`configure` 探不到就跳过,照常编译成功,只是 `sips:` 用不了。 2. 两遍编译为什么 `--prefix` 必须一致? —— **第二遍要靠第一遍装的 `osip2/osip.h` 与 `libosip2.so`**,prefix 不同就找不到。 3. `ldconfig` 不跑会怎样? —— **编译能过、运行报「找不到 libexosip2.so」**。 文件在 `/usr/local/lib` 里,但动态加载器的缓存没更新。下一节真正写一个 UAC 与 UAS——四步就能跑通一通电话。
- ☐ (本节完,下一节 09.02.04 案例:UAS和UAC入门)