以 sqlite3 之类的包为例:
http://packages.ubuntu.com/lucid/i386/libsqlite3-0/filelist
http://packages.ubuntu.com/lucid/i386/libsqlite3-dev/filelist
请注意,链接器名称 ( /usr/lib/libsqlite3.so
) 仅出现在 -dev 包中。几乎所有共享库都适用相同的模式。为什么?dlopen("libsqlite3.so")
除非您有 -dev 变体,否则当该文件丢失时,这不会使尝试动态加载 sqlite3 的程序感到困惑吗?
答案1
该libsqlite3.so
文件只是指向完整版本库文件名的符号链接libsqlite3.so.0.8.6
。在运行时,动态加载器只知道完整版本库。对于大多数共享库来说都是如此。有些库没有版本控制,仅作为libnspr4.so
示例提供。但是,这些库也会根据需要正确打包。
程序不应尝试 dlopen 库的非版本化链接。如果它们希望这样做,它们应该使用libsqlite3.so.0
文件名,例如,安装在二进制库包中的文件名,而不是随附的 -dev 包。这样,如果 sqlite3 在某个时候破坏了 API 兼容性,并且有替代方法,程序将继续工作libsqlite3.so.1
。使用libsqlite3.so.0
将确保程序将使用编写的库的 API。