IO进程----库

1.  库的定义

当使用别人的函数时除了包含头文件以外还要有库

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

linux: .so .a windows: .dll

cd /usr/lib

lib:库文件

cd /usr/include

include:头文件

由于windows 和linux的本质不同,因此二者库的二进制是不兼容

2.  库的分类

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

1)  静态库在程序编译时会被连接到目标代码中。

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

缺点:静态库中的代码复制到了程序中,因此体积较大;

静态库升级后,程序需要重新编译链接

2)  动态库是在程序运行时才被带入到代码中。

优点:程序在执行时加载动态库,代码体积小;

程序升级简单

不同应用程序如果调用相同的库,那么在内存里只需要有一份该共享库的实例。

缺点:运行时还需要动态库的存在,移植性较差

3.  库的制作

3.1.  静态库的制作

1-将源文件编译成生成目标文件

gcc -c xxx.c -o xxx.o

2-创建静态库用 ar命令,将.o转换成.a

ar crs libmyxxx.a xxx.o

静态库文件名的命名规范是以lib为前缀,紧接着跟静态库名,扩展名为.a

3-测试使用静态库:

gcc main.c -L. -lmyadd // -L 指定库的路径 -l指定库名

3.2.  动态库的制作

1-我们用gcc来创建共享库

gcc -fPIC  -c hello.c  -o add.o

-fPIC 创建与地址无关的编译程序 (就是不和路径进行关联)

gcc  -shared  -o  libmyhello.so  add.o

2-测试动态库使用

gcc main.c  -L. -lmyhello

可以正常编译通过,但是运行时报错./a.out: error while loading shared libraries: libmyadd.so: cannot open shared object file: No such file or directory

原因:当加载动态库时,系统会默认从/lib或/usr/lib路径下查找库文件

解决方法(有三种):

(1)把库拷贝到/usr/lib和/lib目录下。(此方法编译时不需要指定库的路径)

(2)在LD_LIBRARY_PATH环境变量中加上库所在路径。

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:.

(终端关闭,环境变量就没在了)

(3) 添加/etc/ld.so.conf.d/*.conf文件。把库所在的路径加到文件末尾,并执行ldconfig刷新

sudo vi xx.conf

添加动态库存在的路径使用绝对路径

关键点:怎么使用库?

将库文件放到系统目录 /usr/lib 或者 /lib

将头文件放在系统目录 /usr/include

#include <xxx.h>

如果头文件在当前目录

#include "xxx.h"

如果头文件在其他目录

#icnlude "头文件的路径/xxx.h"

// 如果没有指定路径的话

#include "xxx.h"

gcc xxx.c -I 头文件路径

-L 路径:指定库的路径

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

-I 路径:(i的大写)指定头文件路径

  • 7
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

你好,奋斗者!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值