链接库分为 静态链接库 和 动态链接库。
静态链接库(a库):在 编译 的时候,库函数中函数的定义已经编译到源文件中,所以,静态链接库在编译完之后存不存在无关紧要。
动态链接库(so库):在 编译 的时候,库函数中函数的定义没有编译到源文件中,只是指定了库文件的路径,所以,编译之后源文件的执行还是依赖于so库文件。
静态链接库和动态链接库的区别在于,主程序在运行前,静态链接库的链接固定写入在程序中,而动态链接库则是在每次程序运行再加载链接。
如果对C语言编译 四步走 不熟悉的同学可以参考这篇文章 :微观的C/C++编译执行过程
在实际开发过程中,动态链接库用的居多,所以,我下面仅讲其的使用步骤:
代码示例
====
准备一个 .c 库函数文件
#include<stdio.h>
#include<stdlib.h>
int wust_test(int value){
printf("%d\n",value);
}
在这里我建议大家也写一个 .h 文件,也就是你这个库函数里面包含 函数的一个申明,这样函数的含义 和 用法便一目了然了。如下:
//功能:测试 so 动态链接库
//参数一:整型
int wust_test(int value);

将这个库函数编译成 so 动态链接库
gcc test.c -fPIC -shared -o libtest.so
gcc 依赖库文件 -fPIC -shared -o libxxx.so
libxxx.so 必须以 lib 开头 .so结尾
-fPIC 作用于编译阶段,告诉编译器产生与位置无关代码(Position-Independent Code),
则产生的代码中,没有绝对地址,全部使用相对地址,故而代码可以被加载器加载到内存的任意
位置,都可以正确的执行。这正是共享库所要求的,共享库被加载时,在内存的位置不是固定的。
-shared 目的是使源码编译成动态库 .so 文件

这个时候 so动态链接库 就生成了,下面我们来看看调用
编写 main.c 文件
#include<stdio.h>
#include<stdlib.h>
int wust_test(int value);
int main(){
wust_test(33);
return 0;
}
最后送福利了,现在关注我并且加入群聊可以获取包含源码解析,自定义View,动画实现,架构分享等。
内容难度适中,篇幅精炼,每天只需花上十几分钟阅读即可。
大家可以跟我一起探讨,欢迎加群探讨,有flutter—底层开发—性能优化—移动架构—资深UI工程师 —NDK相关专业人员和视频教学资料,还有更多面试题等你来拿
点击GitHub领取

%99%E4%BA%9B%EF%BC%9F%E5%A6%82%E4%BD%95%E9%9D%A2%E8%AF%95%E6%8B%BF%E9%AB%98%E8%96%AA%EF%BC%81.md)**
[外链图片转存中…(img-r4IjKkXi-1646145209549)]
本文介绍了动态链接库(SO库)与静态链接库的区别,并详细讲解了如何在C语言中编译SO动态链接库。通过示例代码展示了创建和调用SO库的过程,强调了在编译时使用-fPIC和-shared选项的重要性。同时,文章还提及关注作者并加入群聊可获取相关源码解析和面试资料。
998

被折叠的 条评论
为什么被折叠?



