当前位置: 首页 > java >正文

进程IO之 库

头文件:

#include < xxx .h >    --->  代表从系统路径查找头文件    /usr/include

#include "  xxx . h "    --->先去当前路径查找头文件找不到再去系统路径下查找

头文件也就是.h结尾文件其中包含宏定义结构体共用体枚举定义函数声明外部引用其他文件重定义typedef条件编译

源文件:

包含main函数的xx.c

包含子函数xx.c (其声明放在头文件中)

库文件:

不能包括main函数!!!

本质是二进制文件

1. 库的定义

使用他人的函数时,除了包含头文件还可以用库文件

文件函数声明结构体共用体枚举定义宏定义重定义外部引用其他头文件

库:把一些常用的函数的目标文件打包在一起,提供相应的函数接口,便于程序员使用。本质上来说库是一种可执行代码的二进制形式文件。

2. 库的分类

静态库和动态库:本质区别是代码被载入的时刻不同

2.1静态库

程序编译时,会被复制到目标代码中,以  .a  结尾

优点:程序运行时将不再需要该静态库,运行时无需加载库,运行速度更快,可移植性好

缺点:程序占用空间大,且升级改动不方便,需要重新编译链接

2.2动态库

程序运行时,被载入代码中,也叫共享库,以  .so 结尾

优点:程序体积小,升级改动方便

缺点:每次运行需要重新编译,运行速度慢,且可移植性差

3. 静态库的制作

(1)源文件编译生成目标文件

         gcc -c fun1.c -o fun1.o 
        gcc -c fun2.c -o fun2.o
(2) 创建静态库用ar命令,将多个.o转换成.a
         //以lib为前缀,接着就是静态库的名字,扩展名为.a
       注意:ar命令格式  ar crs lib xxx .a xxx.o xxx.o 
ar crs libfun .a fun1.o fun2.o

  (3)  测试使用静态库: gcc  

        //-L指定路径 -l指定库名

gcc main.c -L. -lfun  

 

4. 动态库的制作

(1)  用gcc来创建共享库

   //-fPIC创建与地址无关的编译程序

        gcc -fPIC -c fun1.c -o fun1.o

        gcc -fPIC -c fun2.c -o fun2.o

        //生成动态库

        gcc -shared fun1.o fun2.o -o libmyfun.so

        //将动态库移动到系统路径下(因为系统使用动态库默认去系统路径 /usr/lib下找)

        sudo mv libmyfun.so /usr/lib

     (2)  测试使用动态库
//因为系统使用动态库默认去系统路径下找,无需指定路径,即不需要 -L

         gcc main.c -lmyfun 

        

5.总结

何时将库载入程序

程序体积

移植

升级

静态库

编译阶段

麻烦

动态库

运行阶段

简单

6.库升级

                          升级前                                                        升级后

静态:    

动态:       

 补充:

(1)gcc的一些选项:

-L 路径指定静态库路径

-l(小写的L) 库名指定库名

-I(大写i) 路径指定头文件路径如果不指定默认就是/usr/include

(2)ldd命令

ldd 可执行文件查看链接动态库
(3)

同名的静态库和动态库:默认优先使用动态库,如果想使用静态库 需要在后面加 -static,这是内核规定的。

如果链接没有lib前缀的库文件,可以直接用-指定库的全名无需加l选项。

http://www.xdnf.cn/news/8920.html

相关文章:

  • 电脑装的数据越多,会不会越重
  • Android 架构演进之路:从 MVC 到 MVI,拥抱单向数据流的革命
  • Milvus部署架构选择和Docker部署实战指南
  • 电子电路:什么是电动势?
  • SpringBoot整合MyBatis
  • CollUtil详解
  • 网络安全--PHP第三天
  • 万勋“机器人服务”全新品牌—汎汐®全球首发!独家服务高空建筑清洗、风机运维等场景
  • Flutter Web 3.0革命:用WebGPU实现浏览器端实时光追渲染,性能提升300%
  • ROS2学习(13)------ 数据分发服务DDS
  • Springboot 整合 WebSocket 实现聊天室功能
  • 【部署】在离线服务器的docker容器下升级dify-import程序
  • [论文阅读]Prompt Injection attack against LLM-integrated Applications
  • 探索Linux互斥:线程安全与资源共享
  • 基于机器学习的沪深300指数波动率预测:模型比较与实证分析
  • Linux:多线程---初识线程
  • IEEE Communications Surveys Tutorials 2025年1月-4月论文速览
  • 李宏毅NLP-7-CTC/RNN-T文本对齐
  • 深入理解设计模式之装饰器模式
  • 如何在Windows右键菜单中添加“以管理员身份运行CMD”的选项(含图标设置)
  • 6.4.2_2最短路径算法-Dijkstra算法
  • DAY34
  • Spring | 在Spring中使用@Resource注入List类型的Bean并按优先级排序
  • VMware+Windows 11 跳过安装阶段微软账号登录
  • TSO-DSO接口有功和无功灵活性区域估计
  • 需求管理工具使用不当,如何优化?
  • 今日は進展があまりありませんでした。悪名高いACM
  • RocketMQ 索引文件(IndexFile)详解:结构、原理与源码剖析
  • WebGL3(WebGL or WebGPU?)
  • QTableWidget的函数和信号介绍