2、Linux初级——库文件制作

目录

一、静态库和动态库的区别

1、静态库(类似于书店,只卖不借)

2、动态库(类似于图书馆,只借不买)

二、库文件的命名

1、必须以lib作为前缀

2、静态库一般以 .a 为后缀 , 动态库一般以.so为后缀

3、库文件的不同版本

三、制作库文件

1、静态库和动态库的原材料都是.o文件(库文件内部不允许出现主函数main)

2、静态库的制作

(1)获得.o文件

(2)把以上生成的两个.o文件一起编译生成静态库文件

         (3)如何使用静态库文件

         (4)结果

四、动态库的制作

1、先获得.o文库

2、把.o 文件制作成动态链接库

3、如何使用动态链接

(1)编译

(2)运行

(3)解决方法

(4)结果

 四、注意


一、静态库和动态库的区别

1、静态库(类似于书店,只卖不借)

编译程序时内容被复制到程序内部,程序不会缺失,不利于更新,占用内存大

2、动态库(类似于图书馆,只借不买)

没有复制到程序中,而是检查是否异常,占用内存少,程序执行效率提高,但是在程序执行的上海需要有动态库的支持

二、库文件的命名

1、必须以lib作为前缀

2、静态库一般以 .a 为后缀 , 动态库一般以.so为后缀

3、库文件的不同版本

1 libc.so.1.0.3
2 lib 库文件的前缀
3 c 库的名字(链接库文件时 ,只需要写上该名字)
4 .so 后缀(so为动态库/共享库 a 则是静态库)
5 .1 库文件的版本号
6 .0.3 修正号 

三、制作库文件

1、静态库和动态库的原材料都是.o文件(库文件内部不允许出现主函数main)

gcc xxx.c -o xxx.o -c

2、静态库的制作

(1)获得.o文件

gcc swap.c -o swap.o -c -fPIC -I../inc
gcc max.c -o max.o -c -fPIC -I../inc

-c 是让编译在在生可重定位文件后停止工作
-fPIC 则是告诉编译器生成于地址无关的可执行文件

(2)把以上生成的两个.o文件一起编译生成静态库文件

ar -rcs libmy_lib.a max.o swap.o

(3)如何使用静态库文件

1 $ gcc src/*.c -I./inc -L./lib -lmy_lib -o bin/main
2 $ gcc 编译器
3 src/*.c 源文件
4 -I./inc -I 指定头文件路径为 ./inc
5 -L./lib -L 指定库文件路径为 ./lib
6 -lmy_lib -l 链接库名 为 my_lib
7 -o bin/main -o 指定生成二进制文件为 bin/main

(4)结果

四、动态库的制作

1、先获得.o文库

gcc swap.c -o swap.o -c -fPIC -I../inc
gcc max.c -o max.o -c -fPIC -I../inc

2、把.o 文件制作成动态链接库

gcc -shared -fPIC -o libmy_lib.so.0 *.o 

gcc 编译器
-shared 生成动态链接库
-fPIC 生成于地址无关的二进制文件
-o libmy_lib.so.0 输出一个动态链接库名字 libmy_lib.so.0
*.o 所有的.o文件

3、如何使用动态链接

(1)编译

gcc src/*.c -I./inc -L./lib -lmy_lib -o bin/mian

(2)运行

./mian 

./mian: error while loading shared libraries: libmy_lib.so:
cannot open shared object file:
No such file or directory

问题:因为动态库在我们运行程序的时候需要加载到内存中,加载的动作由系统来完成。系统并不知 道我们的库在哪里,因此加载失败。

(3)解决方法

方法1【推荐使用】

系统虽然不知道我们自己的库在哪里, 但是它有一些默认路径(在环境变量中预先写好的 路径) 。因此我们可以把自己的动态库文件方到系统默认的路径下即可 (/usr/lib 或者 /lib )

sudo cp lib/libmy_lib.so /usr/lib/ // 把自己的库文件拷贝到 /usr/lib

方法二

(1)确定自己的库的路径,将库的路径写入到环境变量中

vim ~/.bashrc

(2)在文件末尾添加一行

 (3)可以重新打开新的终端或者重新生效配置脚本

 source ~/.bashrc //重新生效 ~/.bashrc文件

(4)结果

 四、注意

如果动态库于静态库名字一样,而且放一起,则编译器默认使用动态链接

如何指定让编译器使用静态库 -static

 $ gcc src/*.c -o bin/main -L./lib -I./inc -lmy_lib -static
2 // -static 则是让编译器选择静态编译 程序会变得很大
3 // 以后运行的时候完全不需要任何的动态库支持

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值