十大电脑必玩大型免费网游,seo外包服务专家,wordpress弹窗订阅,家装公司招聘装修工人七十二、 函数库
1. 库的概念 库是一个二进制可执行文件#xff0c;与二进制可执行程序比较#xff0c;库是不能单独运行的。 库中存放的是功能函数#xff0c;没有主函数#xff08;main函数#xff09; 库需要被载入到内存中使用 标准的基础库中存放了很多已经写好的…七十二、 函数库
1. 库的概念 库是一个二进制可执行文件与二进制可执行程序比较库是不能单独运行的。 库中存放的是功能函数没有主函数main函数 库需要被载入到内存中使用 标准的基础库中存放了很多已经写好的成熟的可以复用的功能代码例如printf scanf 不同操作系统有自己的库不兼容
库的分类 静态库动态库
windowsLinux静态库*.lblibxxx.a动态库*.dlllibxxx.so
2. 静态库
1原理
通过静态库封装的功能函数在程序编译到 链接库 步骤的时候会将函数 继承 到可执行程序中。
优点
程序运行的时候与静态库没有任何关系方便移植。运行速度比动态库快
缺点
大。存储的时候浪费磁盘空间运行的时候浪费内存空间。程序更新部署比较麻烦。
2制作指令
gcc -c func.c -o func.o 一步完成预处理编译汇编
ar -crs libxxx.a func.o 生成一个静态库库的名字叫做xxxar -crs libxxx.a func1.o func2.o func3.oar : 用于创建或操作静态库
-c : 创建静态库
-r : 将文件插入静态库或者替换静态库中的同名文件
-s : 重置静态库索引
3制作流程
分文件将主函数与功能函数分开例如分成main.c func.c编写头文件例如func.h将main.c和func.c联合编译验证分文件是否正确调用上述静态库制作指令创建一个静态库libxxx.a。注意静态库的名字是xxx根据下面的使用方式链接静态库即可
4使用方式
gcc main.c -L库的路径 -l库的名字 最终生成一个a.out可执行二进制程序 gcc main.c -L库的路径 -l库的名字 -o main 最终生成一个main可执行二进制程序 -l小写的L
3. 动态库共享库
1原理
用动态库封装的功能函数把库函数的链接推迟到 程序运行 的时候。
当程序执行到库函数的时候会到内存中找动态库函数。 若内存中不存在该动态库函数则会将该动态库函数加载到内存中若内存中存在该动态库函数则直接调用动态库函数不会加载第二份。
优点
小存储的时候节省磁盘空间运行的时候节省内存空间程序的更新部署比较方便不需要重新编译烧录。
缺点
程序运行的时候若没有找到对应动态库函数则会导致程序崩溃。运行速度比静态库慢
2制作指令
gcc -fPIC -c func.c -o func.o 完成预处理 编译 汇编
gcc -shared -o libxxx.so func.o 生成一个动态库库的名字是xxx;gcc -shared -o libxxx.so func1.o func2.o func3.o3制作流程
分文件将主函数与功能函数分开例如分成main.c func.c编写头文件例如func.h将main.c和func.c联合编译验证分文件是否正确调用上述动态库制作指令创建一个动态库libxxx.so。注意动态库的名字是xxx根据下面的使用方式链接动态库即可
4使用方式 原因环境变量没有配置若没有配置则会默认到/lib/ 或者 /usr/lib/ 目录下查找动态库
5环境变量配置
将动态库移动到 /lib/ 或者 /usr/lib/
sudo mv ./libmyfunc.so /lib/在LD_LIBRARY_PATH这个环境变量中加上库所在的绝对路径
export LD_LIBRARY_PATH$LD_LIBRARY_PATH:动态库所在目录的绝对路径export LD_LIBRARY_PATH$LD_LIBRARY_PATH:/home/ubuntu/mydir/23071/02_socket/09_library/
只在设置终端有效修改配置文档
1. cd /etc/ld.so.conf.d
2. sudo touch xxx.conf (xxx自定义可以修改)
3. sudo vim xxx.conf 将动态库所在目录的绝对路径写入到文件中且一行一个动态库目录路径。
4. 保存退出后终端输入 sudo ldconfig 刷新环境变量