直接用GCC命令编译一个动态库

一、写一个简单的函数

// 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

它的解释如下

  1. -shared

    • 这个选项告诉 gcc 你想要创建一个共享库(也称为动态链接库)。与静态库不同,共享库在运行时被加载到内存中,并且可以被多个程序同时共享。
  2. -Wl,-soname,adder

    • -Wl,option 是一个特殊的选项,它允许你将 option 传递给链接器(linker)。在这种情况下,你正在使用 -soname 选项,它是链接器的一个选项。
    • -soname 定义了共享库的“soname”或“short name”。这个名称在动态链接时被用来查找和引用共享库。它与文件名 adder.so 可能不同,但它提供了一种稳定的方式来引用库,即使库的次要版本发生更改也是如此。
    • 在这个例子中,adder 是库的 soname。
  3. -o adder.so

    • -o 选项用于指定输出文件的名称。在这里,你告诉 gcc 你想要创建的共享库应该被命名为 adder.so
  4. -fPIC

    • -fPIC(Position-Independent Code)选项告诉编译器生成与位置无关的代码。这对于共享库是必要的,因为共享库可以在内存中的任何位置被加载。
    • PIC 代码不依赖于它在内存中的绝对地址,这使得它可以在多个程序之间共享,而不需要重新编译或重新链接。
  5. add.c

    • 这是你要编译的源文件。在这个例子中,你有一个名为 add.c 的 C 语言源文件,它可能包含了一些你想要在共享库中提供的函数(例如,一个加法函数)。

其中-soname的作用再详细描述一下:

-soname 参数在编译共享库(也称为动态链接库)时非常重要,它指定了库的共享对象名称(Shared Object Name,简称 soname)。-soname 参数允许开发者为共享库指定一个稳定的名称,该名称在库的多个版本之间保持一致。这有助于实现库的向后兼容性,并允许开发者在不破坏已编译程序的前提下更新库。下面是关于 -soname 的详细描述:

  1. soname 的作用
    • soname 是动态链接器在运行时查找和加载共享库时所使用的名称。
    • 它允许系统中存在多个版本的共享库,只要它们的 soname 相同,程序就可以无缝地链接到这些库的不同版本。
  2. soname 的格式
    • 通常,soname 的命名约定是 lib<name>.so.<major>,其中 <name> 是库的名字,<major> 是主版本号。
    • 例如,对于库文件 libadder.so.1.2.3,其 soname 可能是 libadder.so.1
  3. 在编译命令中的使用
    • -soname 并不是直接传递给 gcc 的选项,而是通过 -Wl, 前缀传递给链接器(linker)的选项。-Wl, 允许将后续的参数直接传递给链接器。
    • 例如,在 gcc 命令中,-Wl,-soname,libadder.so.1 会告诉链接器将 soname 设置为 libadder.so.1
  4. soname 与文件名
    • soname 与共享库的实际文件名(如 libadder.so.1.2.3)是不同的。
    • 文件名可以包含主版本号和次版本号,而 soname 通常只包含主版本号。
    • 当程序链接到共享库时,它实际上链接到的是 soname,而不是具体的文件名。这样,即使库文件的具体版本发生变化(只要 soname 保持不变),已编译的程序也不需要重新链接。
  5. soname 的重要性
    • 通过使用 soname,可以实现库的向后兼容性。只要新的库版本与旧的库版本在 soname 指定的接口上保持一致,就可以替换旧的库版本而不会破坏已编译的程序。
    • 这也允许库的开发者在不破坏已编译程序的前提下,修复 bug 或添加新的功能 
    以上部分内容由AI生成,但已经过人工确认及核对。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值