一、写一个简单的函数
// add.c
#include <stdio.h>
int adder(int a, int b) {
return a + b;
}
二、编译动态库如下指令
gcc -shared -Wl,-soname,adder -o adder.so -fPIC add.c
它的解释如下
-
-shared:
- 这个选项告诉
gcc你想要创建一个共享库(也称为动态链接库)。与静态库不同,共享库在运行时被加载到内存中,并且可以被多个程序同时共享。
- 这个选项告诉
-
-Wl,-soname,adder:
-Wl,option是一个特殊的选项,它允许你将option传递给链接器(linker)。在这种情况下,你正在使用-soname选项,它是链接器的一个选项。-soname定义了共享库的“soname”或“short name”。这个名称在动态链接时被用来查找和引用共享库。它与文件名adder.so可能不同,但它提供了一种稳定的方式来引用库,即使库的次要版本发生更改也是如此。- 在这个例子中,
adder是库的 soname。
-
-o adder.so:
-o选项用于指定输出文件的名称。在这里,你告诉gcc你想要创建的共享库应该被命名为adder.so。
-
-fPIC:
-fPIC(Position-Independent Code)选项告诉编译器生成与位置无关的代码。这对于共享库是必要的,因为共享库可以在内存中的任何位置被加载。- PIC 代码不依赖于它在内存中的绝对地址,这使得它可以在多个程序之间共享,而不需要重新编译或重新链接。
-
add.c:
- 这是你要编译的源文件。在这个例子中,你有一个名为
add.c的 C 语言源文件,它可能包含了一些你想要在共享库中提供的函数(例如,一个加法函数)。
- 这是你要编译的源文件。在这个例子中,你有一个名为
其中-soname的作用再详细描述一下:
-soname 参数在编译共享库(也称为动态链接库)时非常重要,它指定了库的共享对象名称(Shared Object Name,简称 soname)。-soname 参数允许开发者为共享库指定一个稳定的名称,该名称在库的多个版本之间保持一致。这有助于实现库的向后兼容性,并允许开发者在不破坏已编译程序的前提下更新库。下面是关于 -soname 的详细描述:
- soname 的作用:
- soname 是动态链接器在运行时查找和加载共享库时所使用的名称。
- 它允许系统中存在多个版本的共享库,只要它们的 soname 相同,程序就可以无缝地链接到这些库的不同版本。
- soname 的格式:
- 通常,soname 的命名约定是
lib<name>.so.<major>,其中<name>是库的名字,<major>是主版本号。 - 例如,对于库文件
libadder.so.1.2.3,其 soname 可能是libadder.so.1。
- 通常,soname 的命名约定是
- 在编译命令中的使用:
-soname并不是直接传递给gcc的选项,而是通过-Wl,前缀传递给链接器(linker)的选项。-Wl,允许将后续的参数直接传递给链接器。- 例如,在
gcc命令中,-Wl,-soname,libadder.so.1会告诉链接器将 soname 设置为libadder.so.1。
- soname 与文件名:
- soname 与共享库的实际文件名(如
libadder.so.1.2.3)是不同的。 - 文件名可以包含主版本号和次版本号,而 soname 通常只包含主版本号。
- 当程序链接到共享库时,它实际上链接到的是 soname,而不是具体的文件名。这样,即使库文件的具体版本发生变化(只要 soname 保持不变),已编译的程序也不需要重新链接。
- soname 与共享库的实际文件名(如
- soname 的重要性:
- 通过使用 soname,可以实现库的向后兼容性。只要新的库版本与旧的库版本在 soname 指定的接口上保持一致,就可以替换旧的库版本而不会破坏已编译的程序。
- 这也允许库的开发者在不破坏已编译程序的前提下,修复 bug 或添加新的功能

6088

被折叠的 条评论
为什么被折叠?



