首先准备俩个源文件
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的形式,这样可以方便管理共享库。
304






