linux中制作动态库,Linux下动态库制作与使用

有一文件 apple.c 需要做成在 arm 平台下可以使用动态库,且该文件依赖与 jpeg 图片解码库 libjpeg.so

gcc 编译器中 -I 代表头文件路径 -L 代表依赖的库所在路径

1: 生成 apple.o 文件

编译命令: arm-none-linux-gnueabi-gcc apple.c -o apple.o -I /home/gec/jpeg/include -c fPIC -ljpeg

/home/gec/jpeg/include: 为 jpeg 库需要的头文件路径

ljpeg: 指明需要链接的库名为: libjpeg

2; 生成 libapple.so 文件

编译命令: arm-none-linux-gnueabi-gcc -shared -fPIC -o libapple.so apple.o

libapple.so: 生成的库名,库名要以 “lib” 为前缀,".so" 为后缀

3: 现在我有一个叫 user.c 的文件要包含 libapple.so 这个库

编译命令: arm-none-linux-gnueabi-gcc user.c -o userelf -ldl -L/home/gec/jpeg/lib/ -ljpeg

userelf: 生成的可执行文件名

/home/gec/jpeg/lib/ -ljpeg: 我的 user.c 与jpeg库没有直接联系的为什么要链接呢?

原因: user.c 需要链接 libapple.so 而 libapple.so 要依赖与 libjpeg.so。如果在编译 user.c 时没有

链接 libjpeg.so 库,那么在 userelf 运行时,libapple.so 就无法找到 libjpeg.so 。这种情况在编译

时时不会有任何提示信息的,需要自己注意。

ldl: 在程序中打开库的话需要链接库相关操作的动态库

库操作相关函数

dlopen函数: void *dlopen(const char *filename, int flags)

//使用方法:

void *handle = dlopen("libapple.so", RTLD_NOW);

if (handle == NULL)

{

perror("打开库出现的错误或者库不存在");

exit(1);

}

//假如在 libapple.so 中有一个 char *show(int a); 函数

char *(*show)(int a) = dlsym(handle, "show");

//现在在 user.c 中的函数指针 show 就是libapple.so 中的 show 函数,二者没有区别

失败或者错误时返回值为空 :NULL

filename: 可以是绝对路径下的文件名, 也可以是单独的文件名。后者需要设置环境变量 LD_LIBRARY_PATH

flags : 指明什么时候加载动态库,一般立即加载。则 flags 可以是: RTLD_NOW

dlsym函数: void *dlsym(void *handle, const char *symbol)

返回值为函数指针,通过该函数指针可以直接使用到libapple.so 中的 symbol 函数

handle: 由 dlopen 得到的动态库指针

symbol: 需要使用的函数的函数名

最后还是写一下静态库的制作

1,制作*.o文件:

gcc example.c -o example.o -c -fPIC

2,制作静态库:

ar rcs libxxx.a *.o

注意:

当同一个目录下,有重名的动态、静态库,默认情况下会自动连接动态库

如果要指定静态库:

gcc example.c -o exmaple -L dir/ -lname -static

库名:除了前缀后缀之外的,比如libxxx.so ,库名就是xxx

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值