共享库的使用(.so)文件
1、共享库的概念
2、创建共享库命令
# 1、将.c生成.o文件,(生成与位置无关的代码-fPIC)
gcc -c add.c -o add.o -fPIC
# 2、使用 gcc -shared 制作动态库
gcc -shared lib库名.so add.o sub.o div.o
# 3、编译可执行程序时,指定所使用的动态库。-l: 指定库名 -L: 指定库路径
gcc test.c -o a.out -l mymath -L ./lib
4.运行可以执行程序 ./a.out 出错!!!
原因 连接器 工作于链接阶段,工作时需要 -l 和 -L
动态连接器 工作于程序运行阶段,工作时需要提供动态库所在目录位置
5、解决:把动态库配置到环境变量中 (建议使用绝对路径)
export LD_LIBRARY_PATH=./lib
报错了:在加载动态库的时候出错了,库名叫 libmymath.so,不能打开共享文件,没有这个文件或者目录
2、把动态库配置到环境变量中
1 |
gcc -shared -fpci -o lib/libmath.so obj/mymath.o
|
具体加不加 fpci 这个要看平台支持吧支持;具体详情可以查阅 shared的相关参数文档
这里有一个-fPIC参数
PIC就是position independent code
PIC使.so文件的代码段变为真正意义上的共享
如果不加-fPIC,则加载.so文件的代码段时,代码段引用的数据对象需要重定位, 重定位会修改代码段的内容,这就造成每个使用这个.so文件代码段的进程在内核里都会生成这个.so文件代码段的copy.每个copy都不一样,取决于 这个.so文件代码段和数据段内存映射的位置.
3、使用共享库命令
1 2 3 4 5 |
daokr@ubuntu:/mnt/hgfs/mystudy/clession$ gcc -shared -o lib/libmymath.so obj/mymath.o
daokr@ubuntu:/mnt/hgfs/mystudy/clession$ gcc -o bin/mymath_test2008 obj/mymath_test.o -Llib -lmymath
daokr@ubuntu:/mnt/hgfs/mystudy/clession$ ./bin/mymath_test2008
./bin/mymath_test2008: error while loading shared libraries: libmymath.so: cannot open shared object file: No such file or directory
daokr@ubuntu:/mnt/hgfs/mystudy/clession$<br>daokr@ubuntu:/mnt/hgfs/mystudy/clession$ sudo cp lib/libmymath.so /usr/lib<br>daokr@ubuntu:/mnt/hgfs/mystudy/clession$ ./bin/mymath_test2008<br>
|
注意:
这样中直接回报错;说是不能够去打开这个共享库文件;两种方式解决这个错误
1)cp libmymath.so /usr/lib (需要root用户)
2)export LD_LIBRARY_PATH=库文件的目录 (这个是临时的;在开个窗口就没啥用了;执行的
1 |
./bin/mymath_test2008 不会被执行
|
)