我正在搞乱 Linux的共享库并遇到了奇怪的问题。我成功创建了一个共享库并获取了librbmp.so.0
文件,然后通过符号链接获得了另外两个文件:librbmp.so
和librbmp.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
答案 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
,依此类推。