赞
踩
静态库:
在程序编译时会被链接到代码中,程序运行时将不再需要静态库。
后缀是lib
静态库的生成:
ar -rc
生成静态库的时候要使用.o文件来进行编译生成
gcc -c print.c -o print.o
ar -rc libtest.a print.o
gcc main.c -L . -ltest -o main
动态库:
在程序编译并不会链接到代码中,而是在程序运行时被载入,动态库又被称为动态链接库,英文简称DLL,DLL是包含可以由多个程序使用的代码和数据的库,DLL是不可执行文件。
前缀
lib
后缀
.so
如何查看一个可执行文件所依赖的库?
ldd + 可执行程序
在linux操作系统下 静态库 linux后缀为.a文件
动态库 linux为.so文件
libhello.so
使用这个动态库,我们直接在makefile文件中 -hello
就行.
LD_LIBRARY_PATH是Linux环境变量名,该环境变量主要用于指定查找共享库(动态链接库)时除了默认路径之外的其他路径。并不是在编译阶段就起效果
ldd命令:
ldd是list, dynamic, dependencies的缩写, 意思是, 列出动态库依赖关系。
动态库生成:
gcc / g++
-shared : 产生共享库的命令行参数
-fPIC:产生位置无关的代码
我们来制作个动态库
先写个test.c
#include<stdio.h>
int print()
{
printf("我是动态库\n");
}
gcc -shared -fPIC test.c -o libtest.so
我们写个测试的代码 main.c
#include<stdio.h>
int main()
{
print();
return 0;
}
此时文件信息
如何让主函数使用这个libtest.so
gcc main.c -L . -ltest
-L 指定链接的库文件路径
-l 链接的库文件路径 (去掉了前后缀)
这样就能找到这个动态库进行链接
**问题:**不论将程序依赖的动态库放到哪里程序都能找到自己依赖的动态库
1:将动态库放到可执行程序的目录下
可执行程序会搜索当前目录
2:环境变量
LD_LIBRARY_PATH : 保存动态库的搜索路径
我们来看这个路径下有什么
总结:
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:
/home/flf/second_stage_review/D_S_Library
每个程序都会收到一张环境表,环境表是一个字符指针数组,每个指针指向一个以’\0’结尾的环境字符串
解耦:互相的影响不是很大
静态链接:在生成可执行程序的时候,加上-static,将库文件内容编译到可执行程序中
静态库和静态链接有什么关系?
没关系。
动态库不止能动态链接,也可以在编译程序的时候静态链接,同理,静态库不仅仅能静态链接,也可以在编译程序的时候动态链接,生成一个动态链接的可执行程序。
动态库优点:
模块体积几乎不变,当多个模块使用该库时,内存中只存在一份代码。
缺点:代码在单独文件中有零散文件
静态库优点:
代码合并到模块中,无零散文件。
静态库缺点:
模块体积变大,多个模块使用库,内存中存在多份代码。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。