符号链接奇怪问题
我搞乱了Linux的共享库并遇到奇怪的问题。我成功地创建了一个共享库并获得librbmp.so.0
文件,然后将它链接到另外两个文件:librbmp.so
和librbmp.so.0.0.1
。然后我将他们复制到/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
在运行应用程序所使用的名称嵌入在链接时库。因此,在构建过程中,链接器引入了一个奇怪的命令行参数。
当使用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
等等。
非常感谢。我设法纠正我的错误,从而摆脱了一个问题:) – Robin92 2012-07-20 21:05:26
用来创建.so的链接命令行是什么? – 2012-07-20 20:50:47
@ MichaelKrelin-hacker添加了您要求的代码 – Robin92 2012-07-20 20:56:07