gcc静态库和动态库的生成以及使用

一.gcc 生成 .a 静态库和 .so 动态库

编译生成hello.h,hello.c,main.c

1.打开虚拟机Ubuntu的终端,在合适的位置创建文件test1
代码如下:

mkdir test1//创建文件夹test1
cd test1//打开文件夹tes1

在这里插入图片描述
2.用Vim编辑器新建一个hello.c文件
vim hello.c
在这里插入图片描述
3.按a进入插入模式,输入代码,按esc后输入:wq,保存并退出
在这里插入图片描述
4.新建hello.h文件
vim hello.h
在这里插入图片描述
在这里插入图片描述
5.以同样的方式新建main.c文件
vim main.c
在这里插入图片描述
在这里插入图片描述

将hello.c编译为.o文件并创建静态库并在程序中使用静态库

1.使用工具gcc,输入命令gcc -c hello.c
在这里插入图片描述2.使用命令 ls看看是否生存了 hello.o 文件
在这里插入图片描述
3.发现已经生成hello.o文件
在这里插入图片描述
4.输入命令创建静态库
ar -crv libmyhello.a hello.o
在这里插入图片描述
5.用ls查看静态库,可看到已经成功
在这里插入图片描述
6.输入命令

gcc main.c libmyhello.a -o hello

在这里插入图片描述
7.运行程序./hello,查看运行结果,输出hello everyone!,表示成功
在这里插入图片描述

由.o 文件创建动态库文件并 在程序中使用动态库

1.输入创建动态库命令

gcc -shared -fPIC -o libmyhello.so hello.o

2.输入ls命令查看创建结果
在这里插入图片描述
3.输入命令

gcc main.c libmyhello.so -o hello

4.输入命令./hello运行发现出错
在这里插入图片描述
5.原因分析
错误提示,找不到动态库文件 libmyhello.so。程序在运行时, 会在/usr/lib 和/lib 等目录中查找需要的动态库文件。若找到,则载入动态库,否则将提 示类似上述错误而终止程序运行。我们将文件 libmyhello.so 复制到目录/usr/lib 中。
6.问题解决途径
用管理员权限,将 libmyhello.so 复制到目录/usr/lib
输入命令sudo cp -i libmyhello.so /usr/lib
输入密码后再次输入./hello运行,这次成功输出
在这里插入图片描述

静态库和动态库同名时,gcc 命令调用库文件情况

1.先删除除.c 和.h 外的所有文件,恢复成我们刚刚编辑完举例程序状态

rm -f hello hello.o /usr/lib/libmyhello.so

2.提示无法删除,原因是权限不够,用管理员权限删除

sudo rm -f hello hello.o /usr/lib/libmyhello.so

3.用ls命令查看该文件夹下的所有文件,不存在hello、hello.o表示删除成功
在这里插入图片描述
4.再来创建静态库文件 libmyhello.a 和动态库文件 libmyhello.so
(1)创建静态库文件

ar -cr libmyhello.a hello.o

(2)创建动态库文件

gcc -shared -fPIC -o libmyhello.so hello.o

5.结论
动态库和静态库同时存在时,优先使用动态库,如果直接使用命令gcc main.c libmyhello.a -o hello 的话,就是指定静态库,从程序 hello 运行的结果中很容易知道,当静态库和动态库同名时,gcc 命令将优先使用动 态库,默认去连/usr/lib 和/lib 等目录中的动态库,将文件 libmyhello.so 复制到目录/usr/lib 中即可。

二.Linux 下静态库.a 与.so 库文件的生成与使用

静态库.a 文件的生成与使用

1.新建文件夹test2,并打开在这里插入图片描述
2.新建c语言文件A1.c,使用工具Vim文本编辑器
在这里插入图片描述
3.以同样的方法创建c语言文件A2.c
在这里插入图片描述
4.同样方式创建文件A.h
在这里插入图片描述
5.新建c语言文件test.c
在这里插入图片描述
在这里插入图片描述
6.生成目标文件并用ls命令查看

gcc -c A1.c A2.c

在这里插入图片描述
7.生成静态库.a 文件

ar crv libafile.a A1.o A2.o

在这里插入图片描述
8.使用.a 库文件,创建可执行程序

gcc -o test test.c libafile.a

运行程序./test输出
在这里插入图片描述

三.自建函数静态库.a 与.so 库文件的生成与使用

静态库.a 文件的生成与使用

1.分别生成文件x2x.c,x2y.c,x.h,main.c
在这里插入图片描述
x2y.c代码

#include<stdio.h>
float f2(int a,int b){
float i;
i=a*b;
printf("This is x2x.c!\n");
return i;
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
2.生成目标文件

gcc -c x2x.c x2y.c

3.输入ls查看
在这里插入图片描述
4.生成静态库.a 文件,使用.a 库文件,创建可执行程序,运行程序main输出

./main

在这里插入图片描述

共享库.so 文件的生成与使用

1.、生成目标文件(.o文件)
在这里插入图片描述2.生成共享库.so 文件

 gcc -shared *.o -o xy.so

在这里插入图片描述
3.使用.so 库文件,创建可执行程序

gcc -o main main.c xy.so

在这里插入图片描述
4执行./main报错
在这里插入图片描述
5.解决思路:
用管理员权限,将xy.so 复制到目录/usr/lib
输入命令sudo cp -i xy.so /usr/lib,根据提示输入密码
再次输入./main
在这里插入图片描述
6.删除/usr/lib下的xy.so动态库

sudo rm -f /usr/lib/xy.so

在这里插入图片描述

四.总结

通过此次的学习,了解到了生成动态库及静态库文件的基础知识,并意识到当动态库和静态库重名时会优先使用动态库,这时需要把/lib下的动态库文件拷贝到urs\lib下才能正常使用。

五.参考文献

gcc静态库和动态库的生成以及使用.

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值