Linux创建自己的共享库.SO

首先准备俩个源文件

add.c

int preadd = 1;

int add (int n1 ,int n2){
    return preadd + n1 + n2;
}

sub.c

int presub = 1;

int sub (int n1 ,int n2){
    return n1 - n2 - presub;
}

 然后分别编译成目标文件,记得加上-fPIC选项,生成位置无关代码

gcc -c -fPIC add.c -o add.o
gcc -c -fPIC sub.c -o sub.o

创建共享库

gcc -shared -o libcalculate.so add.o sub.o

共享库的名字以lib开头,这是Unix-like系统的约定,但也可以是任意名字,这个后面说。

使用共享库

#include <stdio.h>
// #include "calculate.h"

int add (int n1 ,int n2);
int sub (int n1 ,int n2);
int main(){
    printf("add : %d,sub : %d",add(1,2),sub(3,1));
}
gcc useso.c -o useso -L. -lcalculate

这时如果运行useso的话,会弹出找不到libcalculate.so的信息

./useso: error while loading shared libraries: libcalculate.so: cannot open shared object file: No such file or directory

这是因为没有给LD(动态链接器)指定我们的共享库的路径。ld默认会从几个路径下寻找共享库,比如

  • /lib
  • /usr/lib
  • /usr/local/lib

等,如果都找不到就会报错。

这时我们需要设置一个环境变量,让ld首先从这个路径找共享库

export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH

这里将.(当前目录)加入到环境变量LD_LIBRARY_PATH里,:代表路径分隔符,这个环境变量默认是没有的。

再次运行

hmy@lenovoair14:/mnt/c/Just-For-Fun/sharedlib$ ./useso
add : 4,sub : 1hmy@lenovoair14:/mnt/c/Just-For-Fun/sharedlib$

成功。

共享库不一定要以lib开头,例如新建一个共享库calculate.so

gcc -shared -o calculate.so add.o sub.o

如何使用它?甚至比上面的还简单

gcc -o useso useso.c ./calculate.so -Wl,-rpath,./

我们可以直接给编译器指定共享库的路径(编译时),-Wl,-rpath表示给动态链接器指定共享库路径(运行时)。

但推荐使用lib+库名.so的形式,这样可以方便管理共享库。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值