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
4

1 回答 1

2

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

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

另请注意,soname 通常应指定指示 api 级别兼容性的形式。因此,在您的情况下, soname 应该是librbmp.so.0,而实际的输出目标文件应该是librbmp.so.0.0.1. 这样,您可以在改进库时增加版本,只要不破坏二进制兼容性,您的应用程序仍然可以工作。当你破坏 ABI 时,你应该将 soname 撞到librbmp.so.1等等。

于 2012-07-20T20:58:36.747 回答