静态库和动态库
一、静态库
静态库是指在我们的应用中,有一些公共代码是需要反复使用,就把这些代码编译为“库”文件;在链接步骤中,连接器将从库文件取得所需的代码,复制到生成的可执行文件中的这种库。 因此调用静态库的可执行文件一般占用内存较大。
.o文件是静态库最小加载到执行文件代码的最小单位,链接时只会将包含用到函数的.o文件链接进来,并不会链接整个静态库。
1.静态库的优缺点
优点:
- 发布程序的时候,不需要提供对应的库实现
- 加载库的速度快
缺点:
- 库被打包到应用程序中,导致库的体积很大
- 库发生改变时,需要重新编译程序
2.库的命名规则
- 命名规则:lib+库的名字+.a,例如:libmytest.a
3.制作步骤
- 将.c文件生成对应的.o文件:
- 将生成的.o文件打包:ar rcs 静态库的名字 生成的所有.o
- 发布静态库(lib)和头文件(include)给用户即可
二、动态库
1.动态库的优缺点
优点:
- 执行程序体积小
- 动态库更新了,不需要重新编译程序
缺点:
- 发布程序的时候,需要提供动态库给用户
- 动态库没有被打包到程序中,加载速度相对较慢
2.库的命名规则
命名规则:lib+名字+.so
动态库的代码存放在共享库段,只有在运行的时候才会调用该段代码
3.制作步骤
制作过程:
-
生成与位置无关的.o文件(.o):gcc -fPIC -c *.c -I …/include
-
将.o打包成共享库:gcc -shared -o libMy.so *.o -I include
-
共享库的使用:需要通过动态链接器根据环境变量查找动态库
1、gcc main.c lib/libMy.so -o app -Iinlude
2、gcc main.c -Iinclude -L lib -l My app -o app
不可以直接将动态库放到/lib
1、可以通过export LD_LIBRARY_PATH=./lib,将当前动态链接库导入到LD_LIBRARY_PATH路径,只能临时有用,将终端关掉则不生效
2、如果要永久生效,则需要在~/.bashrc文件里导入数据,因为终端在启动的时候都会读一下.bashrc,修改完后需要重启终端
3、需要找到动态链接器的配置文件:vi /etc/ld.so.conf
将动态库的路径写到配置文件中
更新 sudo ldconfig -v