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 秒实验
- 在装了 VS 的机器上跑一遍这个探针,看
cl的路径长什么样。 - 查一下
osip.sln里默认配置是 Debug 还是 Release。 - 用
dumpbin /dependents看编出来的 exe 依赖哪几个 DLL。
常见误区
- 先编 exosip2 再编 osip2。 顺序反了必然链接失败,因为 exosip2 要链
osip2.lib。 - 主程序用 x64、库用 Win32。 架构不一致报链接错,而错误只说找不到符号,不提架构。
- 开发机能跑就以为部署没问题。 运行时还要三个 DLL,放 exe 同目录最省事。
自测三问(点开对答案)
1. 为什么 osip2 可以第一个编? —— **它零依赖**,只用系统库。 所以拿到源码用 VS 打开 `.sln` 就能直接编,不需要先准备任何第三方库。 2. libc_a 什么时候才需要? —— **要用域名而不是 IP 做对端时**(需要异步 DNS)。国标场景基本都用 IP,所以常常跳过。 3. vcpkg 的代价是什么? —— **版本不可控**。有些国标平台对 eXosip 版本敏感,乱升会出现「注册能过、点播失败」这类怪问题。下一节换到 Ubuntu——同样的三个库,换一套命令。
- ☐ (本节完,下一节 09.02.03 Ubuntu下编译oSIP2和eXosip2)