2012-07-20 71 views
0

我搞乱了Linux的共享库并遇到奇怪的问题。我成功地创建了一个共享库并获得librbmp.so.0文件,然后将它链接到另外两个文件:librbmp.solibrbmp.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 
+0

用来创建.so的链接命令行是什么? – 2012-07-20 20:50:47

+0

@ MichaelKrelin-hacker添加了您要求的代码 – Robin92 2012-07-20 20:56:07

回答

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

+0

非常感谢。我设法纠正我的错误,从而摆脱了一个问题:) – Robin92 2012-07-20 21:05:26