3-共享库的创建与使用

来源:互联网 发布:Rstudio server mac 编辑:程序博客网 时间:2024/06/06 02:06

1. 编写代码

int add(int a, int b) {return a + b;}int sub(int a, int b) {return a - b;}# base.h的内容int add(int, int);int sub(int, int);#include<stdio.h>#include "base.h"int main() {printf("10 + 20 = %d\n", add(10, 20));printf("20 - 10 = %d\n", sub(20, 10));return 0;}

2. 生成动态库

gcc -c -fpic add.c sub.cgcc -shared add.o sub.o -o libbase.so或gcc -fpic -shared add.c sub.c -o libbase.so

3. 使用动态库

方式1:执行如下两条命令会再当前目录下生成main程序

gcc -c main.cgcc main.o ./libbase.so -o main
执行ldd main命令可以看到main链接库的信息

ldd mainlinux-vdso.so.1 =>  (0x00007ffec5bb7000)libbase.so (0x00007fddb700e000)libc.so.6 => /usr/lib64/libc.so.6 (0x00007fddb6c31000)/lib64/ld-linux-x86-64.so.2 (0x00007fddb7211000)

方式2:执行如下命令生成main程序

注意:此处与上面的方式不同之处在于指定链接库路径及链接库名称

gcc -c main.cgcc main.o -L. -lbase -o main

生成main之后, 执行ldd main查看链接库信息

ldd mainlinux-vdso.so.1 =>  (0x00007fff78bb1000)libbase.so => not foundlibc.so.6 => /usr/lib64/libc.so.6 (0x00007fefcd5ea000)/lib64/ld-linux-x86-64.so.2 (0x00007fefcd9c8000)

不难看出, 如上的方式生成的可执行文件main, 在使用ldd查看时, 提示libbase.so未找到
这是因为-L及-l选项只是告诉编译器库的名字, 而在目标系统支持的情况下, fpic会生成与位置无关的代码
因此实际上编译之后的main中并未记录libbase.so的位置, 仍在系统默认的路径查找
可以使用如下方式进行解决

export LD_LIBRARY_PATH = /home/developer/c/或export LD_LIBRARY_PATH = /home/developer/c/libbase.so
再次使用ldd main查看时, 就不会报错not found

ldd mainlinux-vdso.so.1 =>  (0x00007ffd767ad000)libbase.so => /home/developer/c/libbase.so (0x00007f50e3154000)libc.so.6 => /usr/lib64/libc.so.6 (0x00007f50e2d77000)/lib64/ld-linux-x86-64.so.2 (0x00007f50e3357000)

当然也可以配置系统的ld.so.conf文件进行配置, 配置之后执行ldconfig命令即可


以上内容, 如有错误, 欢迎批评指正。












阅读全文
0 0