为什么库的链接器名称只在 -dev 包中?

为什么库的链接器名称只在 -dev 包中?

以 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。

相关内容