C语言-13-制作动态库

1.源文件

c 复制代码
// ~/02_dynamic_Lib/hello.c
#include<stdlib.h>
#include<stdio.h>
#include<string.h>

int main()
{
    printf("%d+%d=%d\n",10,20,add(10,20));
    printf("%d-%d=%d\n",10,20,sub(10,20));
    printf("%d*%d=%d\n",10,20,mul(10,20));
    return 0;
}
c 复制代码
// ~/02_dynamic_Lib/src/add.c
int add(int a,int b)
{
    return a+b;
}
c 复制代码
// ~/02_dynamic_Lib/src/mul.c
int mul(int a,int b)
{
    return a*b;
}
c 复制代码
// ~/02_dynamic_Lib/src/sub.c
int sub(int a,int b)
{
    return a-b;
}

2.制作动态库

2.1.生成二进制文件

bash 复制代码
gcc -c -fPIC ./src/*.c

2.2.生成动态库文件

bash 复制代码
gcc -shared ./*.o -o ./lib/libmymath.so

3.动态库的使用

3.1.编译可执行文件

bash 复制代码
gcc hello.c -L ./lib -l mymath -o app

3.2.执行可执行文件

bash 复制代码
(base) ysf@ysf-virtual-machine:~/c-study/02_dynamic_lib$ ./app

输出如下:

bash 复制代码
./app: error while loading shared libraries: libmymath.so: cannot open shared object file: No such file or directory

3.3.使用ldd查看动态库依赖

bash 复制代码
ldd app

输出如下:

bash 复制代码
	linux-vdso.so.1 (0x00007ffc63860000)
	libmymath.so => not found
	libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x0000750eb6a00000)
	/lib64/ld-linux-x86-64.so.2 (0x0000750eb6c62000)

可以发现,动态库没有被正确找到

4.配置动态库的4种方式

4.1.使用环境变量

bash 复制代码
export LD_LIBRARY_PATH=/home/ysf/c-study/02_dynamic_lib/lib

4.2.使用环境变量配置文件~/.bashrc

bash 复制代码
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/ysf/c-study/02_dynamic_lib/lib

4.3.将动态库文件放到系统目录

可以放到下面的目录里面:

  • /lib
  • /usr/lib

4.4文件缓存(最佳)

  • 修改/etc/ld.so.conf文件,在里面换行加上自己的库目录,如下:
bash 复制代码
include /etc/ld.so.conf.d/*.conf
/home/ysf/c-study/02_dynamic_lib/lib
  • 修改完成后执行如下命令,更新缓存ld.so.cache:
bash 复制代码
sudo ldconfig -v

5.再次执行可执行文件

bash 复制代码
./app

可以看到报错被解决

相关推荐
C++ 老炮儿的技术栈2 小时前
我们在设计tcp协议时,要传一个字符串过去,报文:头十长度十内容,是否要把‘\0‘也填入,长度是否包含‘\0‘
开发语言·数据结构·c++·mfc·c
传奇开心果编程2 小时前
【Rust入门练中学】第2课:变量、可变性与常量
开发语言·学习·rust
zr想努力2 小时前
从0开始配置Perforce4环境
开发语言
Navigator_Z3 小时前
LeetCode //C - 1252. Cells with Odd Values in a Matrix
c语言·算法·leetcode
幸运小圣4 小时前
PointerEvent 常用属性与事件整理【JavaScript】
开发语言·javascript·ecmascript
长谷深风1114 小时前
评测AI Agent:三种裁判各司其职
java·大数据·开发语言·人工智能·ai agent
边境悍匪4 小时前
蜗牛学苑 Java 智能体学习 Day42|项目周开发技术汇总 1 思维导图复盘
java·开发语言·spring boot·学习·spring
君顾15 小时前
本地托管机构管理源码实战:需求拆解、数据建模与多端部署
java·开发语言·托管
是隼人5 小时前
buuctf-pwn [NewStarCTF 2023 公开赛道]stack migration(64位栈迁移)题解(学习过程持续更新)
c语言·学习·安全·pwn入门·ctf入门
传奇开心果编程6 小时前
【Rust入门练中学】 第3课:数据类型
开发语言·学习·rust