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

Windows 下要按顺序编三个库:libc_a(可选)→ osip2 → exosip2,顺序反了就链不上。 本机没装 VS,所以这一节只能给流程——但流程本身是准的,每步的依赖关系都能验证。

📝 本节和前面几节的关系

09.02.01 讲了分层,这一节把它编出来。 08.08.02 与 08.08.03 是 gSOAP 的 Windows 与 Linux 编译,这边是同一件事的两个平台版本, 连「可选依赖」这种坑都一样。

一、三个库,一条链

顺序 编什么 依赖谁
1 libc_a(可选) 无
2 osip2 只有系统库
3 exosip2 osip2
4 你自己的程序 exosip2

第二行那个「只有系统库」很关键:osip2 是零依赖的, 拿到源码用 VS 打开 .sln 就能编,不需要先装任何东西。 第三行必须等第二行编完,因为 exosip2 要链 osip2.lib、要包含 osip2/osip.h。 第一行那个 libc_a 是 c-ares 异步 DNS 库,只有要用「域名而不是 IP 做对端」时才需要。 国标场景基本都用 IP,所以常常跳过。

二、用 VS 打开哪个文件

库 打开哪个 编出来的东西
osip2 platform/vs2010/osip.sln osip2.lib
exosip2 platform/vs2010/exosip.sln exosip2.lib

路径里那个 vs2010 不用怕:高版本 VS 打开时会自动升级工程, 弹一个「是否重定向」的对话框,点「确定」就行。 要注意两点:① 配置要选 Release 还是 Debug 得和你的主程序一致; ② 平台要选 x64 还是 Win32 也得一致。 这两条不一致的表现都是「链接错误」,而报错信息只说什么符号找不到,不会告诉你「架构不对」。

三、vcpkg 是一条捷径

不想自己编的话,vcpkg 两条命令就能拿到库:

vcpkg install osip:x64-windows
vcpkg install libexosip:x64-windows

代价是「版本不一定是你想要的那个」,而做国标对接时这点很重要: 有些平台对 eXosip 的版本敏感,乱升会出怪问题。 典型症状是「注册能过、点播失败」,查半天发现是某个头字段在新版本里改了默认值。 所以要么锁版本,要么就用源码自己编——后者麻烦但可控。

四、运行时还差 DLL

编译通过不等于能跑,Windows 上还差动态库:

阶段 需要什么 放哪
编译 .lib 与头文件 工程配置里指
运行 .dll exe 同目录

第二行那个是最常见的「在我机器上能跑」:开发机上 DLL 在 PATH 里,拷到别的机器就找不到。 表现是启动时弹「无法启动此程序,因为计算机中丢失 libexosip2-5.dll」—— 这个错很明确,反而是好事。 更麻烦的是「找不到但也不报错」的情况:某些版本的加载器会静默跳过,然后程序在调用时崩。 所以部署清单里应该写清三个 DLL: libosip2-5.dll、libexosip2-5.dll、libcares.dll(可选)。

五、本机为什么给不了编译输出

这一段是诚实的边界声明:

工具 本机有没有
cl(MSVC 编译器) 无
msbuild 无
devenv 无

三个全无,因为这台机器没装 VS。 所以「在 Windows 上编 oSIP」这件事,没装 VS 就一步也走不了。 不给输出比编一个假输出好:编造一个「编译成功」的日志,读者照着做会对不上, 而那时代价更大。 能给的是「依赖关系」与「坑的位置」,这两样不依赖具体环境,是真的。

六、动手 Demo:Windows 下要编三个库

Demo 先探一遍工具链,把「有没有 VS」这件事变成可核对的结果。 探针本身在任何 Windows 机器上都能跑,拿到装了 VS 的机器上跑就会打路径。

import shutil
for tool in ("cl", "msbuild", "devenv", "nmake", "cmake", "vcpkg"):
    print(tool, shutil.which(tool))

实跑输出:

--------------------------------------------------------------------
Windows 下要编三个库
--------------------------------------------------------------------
**eXosip 不是单库,它是一条链**:

  顺序      编什么               依赖谁
  ------------------------------------------
  1         `libc_a`(可选)     —
  **2**     **`osip2`**          只有系统库
  **3**     **`exosip2`**        **osip2**
  4         你的程序             exosip2

**第二行那个「只有系统库」是关键**:**osip2 是零依赖的**,**拿到源码用 VS 打开 `.sln` 就能编。**
**第三行必须等第二行编完**,**因为 exosip2 要链 `osip2.lib`、要包含 `osip2/osip.h`**。
**第一行那个 `libc_a` 是可选的**:**它是 c-ares 异步 DNS 库**,
**只有要用「域名而不是 IP 做对端」时才需要。**
**国标场景基本都用 IP,所以常常跳过。**

**本机先探一遍工具链**:

  工具        路径
  -------------------
  cl          **无**
  msbuild     **无**
  devenv      **无**
  nmake       **无**
  cmake       **无**
  vcpkg       **无**

**六个全是「无」**,**因为这台机器没装 VS**——**所以这一节只能给流程,给不了编译输出。**
**这不是取巧,而是这一节诚实的边界**:**「在 Windows 上编 oSIP」这件事,没装 VS 就一步也走不了。**

**没装 VS 的人还有一条路:vcpkg**——**`vcpkg install osip:exosip` 两条命令就能拿到库**,
**代价是版本不一定是你想要的那个。**
**做国标对接时这点很重要**:**有些平台对 eXosip 的版本敏感,乱升会出怪问题。**

六行全是「无」,这就是这一节只能给流程的原因。 注意 cmake 也在列表里且没有:oSIP 官方用的是 autotools 加 VS 工程,不提供 CMakeLists, 所以就算装了 cmake 也用不上。 这一点和很多现代库不同: 现在新库基本都给 CMake,而 oSIP 这种 2000 年代起的库还是 configure 加 .sln 两条腿。 vcpkg 没有也不奇怪,它要单独装。 但如果装了 vcpkg,cl 通常也就有了——因为 vcpkg 编译时要调 MSVC。

30 秒实验

  1. 在装了 VS 的机器上跑一遍这个探针,看 cl 的路径长什么样。
  2. 查一下 osip.sln 里默认配置是 Debug 还是 Release。
  3. 用 dumpbin /dependents 看编出来的 exe 依赖哪几个 DLL。

常见误区

  1. 先编 exosip2 再编 osip2。 顺序反了必然链接失败,因为 exosip2 要链 osip2.lib。
  2. 主程序用 x64、库用 Win32。 架构不一致报链接错,而错误只说找不到符号,不提架构。
  3. 开发机能跑就以为部署没问题。 运行时还要三个 DLL,放 exe 同目录最省事。
自测三问(点开对答案) 1. 为什么 osip2 可以第一个编? —— **它零依赖**,只用系统库。 所以拿到源码用 VS 打开 `.sln` 就能直接编,不需要先准备任何第三方库。 2. libc_a 什么时候才需要? —— **要用域名而不是 IP 做对端时**(需要异步 DNS)。国标场景基本都用 IP,所以常常跳过。 3. vcpkg 的代价是什么? —— **版本不可控**。有些国标平台对 eXosip 版本敏感,乱升会出现「注册能过、点播失败」这类怪问题。

下一节换到 Ubuntu——同样的三个库,换一套命令。

相关笔记