符号链接奇怪的问题

时间:2012-07-20 20:48:13

标签: c linux shared-libraries symlink

我正在搞乱 Linux的共享库并遇到了奇怪的问题。我成功创建了一个共享库并获取了librbmp.so.0文件,然后通过符号链接获得了另外两个文件:librbmp.solibrbmp.so.0.0.1。然后我将'em'复制到/usr/local/lib并运行ldconfig,此处我遇到了一个奇怪的行为 - /usr/local/lib中还会出现另一个文件。它被称为--library=ibrbmp.so.0.0.1。奇怪的是,我的应用程序在运行时链接到它。

任何人都知道发生了什么以及如何强制我的应用链接到librbmp.so

这是一段代码:

//creating shared library
$(CC) -shared -Wl,-soname,-librbmp.so.0.0.1 $(OBJECTS) -o librbmp.so.0 -lc

//symlinking
ln -sf librbmp.so.0.0.1 librbmp.so.0
ln -sf librbmp.so.0.0.1 librbmp.so

1 个答案:

答案 0 :(得分:2)

应用程序在运行时使用的名称在链接时嵌入库中。因此,构建过程中的某些内容会向链接器引入一个奇怪的命令行参数。

当使用gcc作为链接器前端时,我假设参数应该是-Wl,-soname=librbmp.so.0。在您的通话中,额外的-可能是导致问题的原因。在调用实际链接器之前,似乎有点愚蠢地将-l的所有实例转换为--library=,然后会看到-soname=--library=ibrbmp.so.0.0.1

另请注意,soname通常应指定表示api级别兼容性的表单。因此,在您的情况下,soname应为librbmp.so.0,实际输出对象文件为librbmp.so.0.0.1。这样,您可以在改进库时增加版本,只要不破坏二进制兼容性,您的应用程序仍然可以工作。当你打破ABI时,你应该将soname压缩到librbmp.so.1,依此类推。