先准备源码文件:
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;
}
- 编译库的源文件
gcc -fPIC -c calc.c
fPIC
:产生位置无关码,允许在任何地址加载
生成calc.o
文件。
- 创建共享库
gcc -shared -Wl,-soname,libcalc.so.1 -o libcalcso.1.1 calc.o
-shared
:生成共享库格式
-Wl
:表示后面的参数将传给link程序ld
- real name : 实际的完整的名称
- so name:记录主版本号
- link name:只是一个链接,在链接的时候使用
- 修改配置文件中动态库的路径
这一步主要是为了编译器能够找到so文件的位置,因为生成的so文件在当前目录下,编译器并不知道,所以,需要修改一下配置文件
sudo vim /etc/ld.so.conf
将so文件所在的目录添加到配置文件中,为了使配置文件生效,还需要执行下面的命令
sudo ldconfig -v
- 使用动态库
gcc main.c -o main libcalc.so.1
然后执行./main
,我们就看到执行的结果为5
。
- 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)
网友评论