Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 符号链接问题_C_Linux_Shared Libraries_Symlink - Fatal编程技术网

C 符号链接问题

C 符号链接问题,c,linux,shared-libraries,symlink,C,Linux,Shared Libraries,Symlink,我在处理Linux的共享库时遇到了一个奇怪的问题。我成功地创建了一个共享库并获取了librbmp.so.0文件,然后将其符号链接到另外两个文件:librbmp.so和librbmp.so.0.1。然后我将它们复制到/usr/local/lib并运行ldconfig,在这里我遇到了一个奇怪的行为-在/usr/local/lib中又出现了一个文件。它被称为--library=ibrbmp.so.0.0.1。奇怪的是,我的应用程序在运行时链接到它 有人知道发生了什么,以及如何强制我的应用程序链接到li

我在处理Linux的共享库时遇到了一个奇怪的问题。我成功地创建了一个共享库并获取了
librbmp.so.0
文件,然后将其符号链接到另外两个文件:
librbmp.so
librbmp.so.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.1
。这样,您可以在改进库时增加版本,只要不破坏二进制兼容性,应用程序仍然可以工作。当你破坏ABI时,你应该将soname切换到
librbmp.so.1
等等。

用于创建的链接命令行是什么。那么?@MichaelKrelin hacker添加了你非常感谢的代码。我设法改正了错误,从而解决了一个问题:)