linux:创建共享库

2020-05-13  本文已影响0人  fck_13

先准备源码文件:
calc.h

#ifndef _CALC_H_
#define _CALC_H_

int add(int a, int b);

int sub(int a, int b);

int mul(int a, int b);

int div(int a, int b);

#endif

calc.c

#include "calc.h"

int add(int a, int b){
    return a+b;
}

int sub(int a, int b){
    return a-b;
}

int mul(int a, int b){
    return a*b;
}

int div(int a, int b){
    return a/b;
}

main.c

#include <stdio.h>
#include "calc.h"

int main(){
    int c = add(1,4);
    printf("%d\n", c);
    return 0;
}
  1. 编译库的源文件
gcc  -fPIC -c calc.c

fPIC:产生位置无关码,允许在任何地址加载
生成calc.o文件。

  1. 创建共享库
gcc -shared -Wl,-soname,libcalc.so.1 -o libcalcso.1.1 calc.o

-shared:生成共享库格式
-Wl:表示后面的参数将传给link程序ld

  1. 修改配置文件中动态库的路径
    这一步主要是为了编译器能够找到so文件的位置,因为生成的so文件在当前目录下,编译器并不知道,所以,需要修改一下配置文件
sudo vim /etc/ld.so.conf

将so文件所在的目录添加到配置文件中,为了使配置文件生效,还需要执行下面的命令

sudo ldconfig -v
  1. 使用动态库
gcc main.c -o main libcalc.so.1

然后执行./main,我们就看到执行的结果为5

  1. ldd 查看使用的库
    如果没有第三步,直接执行第四步的话,我们会得到如下的错误
./main: error while loading shared libraries: libcalc.so.1: cannot open shared object file: No such file or directory

使用ldd命令来查看所缺少的库,执行ldd mian,得到

linux-vdso.so.1 (0x00007fffcc2ef000)
libcalc.so.1 => not found
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fef19900000)
/lib64/ld-linux-x86-64.so.2 (0x00007fef19e00000)
上一篇 下一篇

猜你喜欢

热点阅读