3-共享库的创建与使用

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.c
gcc -shared add.o sub.o -o libbase.so
或
gcc -fpic -shared add.c sub.c -o libbase.so

3. 使用动态库

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

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

ldd main
	linux-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.c
gcc main.o -L. -lbase -o main

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

ldd main
	linux-vdso.so.1 =>  (0x00007fff78bb1000)
	libbase.so => not found
	libc.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 main
	linux-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命令即可


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












  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值