GCC学习(动态库与静态库.a与.so)
文章目录
- 一、GCC生成动态库和静态库
- 静态库.a与.so库文件的生成
- 1.编辑生成例子程序
- 2.生成并使用静态库
- 3.生成并使用动态库
- 4.动态库静态库比较
- 二、.a与.so的生成和使用
- 1.静态库.a的生成和使用
- 2.共享库.so的生成和使用
- 3.文件大小对比
- 三、自建函数静态库.a 与.so 库文件
- 1.编写函数
- 2.静态库.a 文件的生成与使用
- 3.共享库.so 文件的生成与使用
- 4.文件大小对比
- 四、总结
一、GCC生成动态库和静态库
静态库.a与.so库文件的生成
概念 我们通常把一些公用函数制作成函数库,供其它程序使用。函数库分为静态库和动态库两种。静态库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库。动态库在程序编译时并不会被连接到目标代码中,而是在程序运行是才被载入,因此在程序运行时还需要动态库存在。
1.编辑生成例子程序
代码如下
hello.h
#ifndef HELLO_H
#define HELLO_H
void hello(const char *name);
#endif //HELLO_H
hello.c
#include <stdio.h>
void hello(const char *name)
{printf("Hello %s!\n", name);
}
main.c
#include "hello.h"
int main()
{hello("everyone");
return 0;
}
2.生成并使用静态库
gcc编译得到.o文件,再创建并使用静态库
我这里存在一处报错的原因是因为有一个文件我之前命名过,这里覆盖失败,重新写一下就好了。
解释部分命令
#gcc main.c libmyhello.a -o hello //连接
#rm libmyhello.a // 移除
./hello //查看、验证
3.生成并使用动态库
先创建动态库,再执行动态库
注意 会出现两个错误,一个是因为文件运行时在usr/lib中寻找库文件,一个是因为没有执行权限。
按照我的操作步骤执行即可
4.动态库静态库比较
在上面的过程中不难发现,即使移除了静态库,程序仍然可以运行,但是动态库却是程序运行所必需的。
那么,当静态库与动态库同名时,程序会优先使用哪一个呢?
执行以下步骤:
①删除. h .c 以外的所有文件
②建立同名动态库和静态库
③执行比较
通过执行可发现,会出现动态库所需要的步骤,可见,程序会优先使用动态库。
二、.a与.so的生成和使用
1.静态库.a的生成和使用
创建四个文件,代码如下
//A1.C
#include<stdio.h>
void print1(int arg)
{printf("A1 print arg:%d\n",arg);
}//A2.c
#include<stdio.h>
void print2(char *arg)
{printf("A2 printf arg:%s\n",arg);
}//A.h
#ifndef A_H
#define A_H
void print1(int);
void print2(char *);
#endif//test.c
#include<stdio.h>
#include"A.h"
int main()
{print1(1);print2("test");exit(0);
}
具体操作如下
2.共享库.so的生成和使用
共享库文件大小
3.文件大小对比
通过以上的实验不难发现静态库比动态库小许多,但是文件使用时,会优先使用动态库
三、自建函数静态库.a 与.so 库文件
目标
①使用main函数代码调用x2x和x2y ;将这3个函数分别写成单独的3个 .c文件,并用gcc分别编译为3个.o 目标文件;将x2x、x2y目标文件用 ar工具生成1个 .a 静态库文件, 然后用 gcc将 main函数的目标文件与此静态库文件进行链接,生成最终的可执行程序,记录文件的大小。
②将x2x、x2y目标文件用 ar工具生成1个 .so 动态库文件, 然后用 gcc将 main函数的目标文件与此动态库文件进行链接,生成最终的可执行程序,记录文件的大小,并与之前做对比。
1.编写函数
编写以下四个函数
x2x.c
#include<stdio.h>
float f1(int a,int b){float i;
i=a+b;
printf("This is x2x.c!\n");
return i;
}
x2y.c
#include<stdio.h>
float f2(int a,int b){float i;
i=a*b;
printf("This is x2x.c!\n");
return i;
}
x.h
#ifndef x_H
#define x_H
float f1(int,int);
float f2(int,int);
#endif
main.c
#include<stdio.h>
#include"x.h"
int main(){int a=2,b=3;float m,n;m=f1(a,b);printf("%f\n",m);n=f2(a,b);printf("%f\n",n);return 0;
}
2.静态库.a 文件的生成与使用
具体的创建步骤上面已经有了介绍,这里不做赘述
①文件生成过程
②运行结果及文件大小
3.共享库.so 文件的生成与使用
①文件生成过程
同样的,遇到报错使用管理员权限转移文件
②执行结果及文件大小
4.文件大小对比
通过比较两个文件大小可以发现,动态库比静态库大许多。在这里附上一个关于动静态库对比的链接动静态库对比
四、总结
通过这一篇的学习,我更加熟练了gcc的常用命令,学会了解决动态库生成过程中无法汇编的方法,对于什么是动态库,什么是静态库有了更加清晰的认识与了解。掌握了自己汇编生成动态库和静态库的方法。
参考链接gcc生成静态库.a和动态库.so
GCC学习(动态库与静态库.a与.so)相关推荐
- 【Linux学习】动态库和静态库
目录 一.动静态库的概念和原理 1. 认识动静态库 2. 动静态库的概念 3. 动静态库的原理 二.动静态库的生成与打包 1. 静态库的生成与打包 2. 动态库的生成与打包 三.动静态库的使用 1. ...
- gcc g++ Linux下动态库_静态库
关于Unix静态库和动态库的分析 基本概念 库有动态与静态两种,动态通常用.so为后缀,静态用.a为后缀. 例如:libhello.so libhello.a 为了在同一系统中使用不同版本的库,可以在 ...
- [学习备忘录]Linux平台静态库、动态库的一些笔记
先声明几点: 1.操作系统:linux(fc9).编译器:gcc-4.3.0.编辑器:包括但不限于emacs.vim.这些无理由也不应造成限制. 2.生成的可执行文件名称比较有规律,仅仅是为了演示的方 ...
- 在Linux下如何使用GCC编译程序、简单生成静态库及动态库。
在Linux下如何使用GCC编译程序.简单生成 静态库及动态库. 本文适用于Linux下开发初学者.本文初步讲解在Linux下如何使用GCC编译程序.简单生成静态库及动态库. 一.关于安装.一般系 ...
- 用 gcc生成静态库和动态库以及静态库和动态库的使用
文章目录 一.linux下gcc生成静态库和动态库以及库文件的使用 1.准备过程 2.静态库的创建及使用 (1)创建静态库 (2)程序中使用静态库 3.动态库的创建及使用 (1)创建动态库 (2)程序 ...
- cmake学习(一)静态库与动态库构建
(.so)共享库,shared object:节省空间,在运行时去连接,如果执行机器上没有这些库文件就不能执行. (.a)静态库,archive:静态库和程序化为一体,不会分开. 通过 ldd命令可以 ...
- 【Linux】动态库与静态库
动态库与静态库 文件系统补完 文件的三个时间acm 动态库与静态库 动态链接与静态链接 静态库与动态库 动静态库的对比 生成静态库 打包静态库 使用静态库 生成动态库 打包动态库 使用动态库 文件系统 ...
- 技巧:Linux 动态库与静态库制作及使用详解
http://www.ibm.com/developerworks/cn/linux/l-cn-linklib/ 技巧:Linux 动态库与静态库制作及使用详解 标准库的三种连接方式及静态库制作与使用 ...
- 【Linux】动态库与静态库,如何打包库,如何使用第三方库
文章目录 回顾基础 学会打包自己的库并使用 静态库 打包库 第三方库的使用 动态库 打包库 第三方库的使用 动态库加载以及周边问题 回顾基础 这篇文章主要对动静态库进行进一步的学习,关于动静态库的一些 ...
- linux代码动态分析软件,举例分析Linux动态库和静态库
函数库分为静态库和动态库两种.创建Linux静态库和Linux动态库和使用它们在这里将以举例的形式详述一下.静态库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库.动态库在程序编译时并不 ...
最新文章
- 反应式服务中的线程本地状态可用性
- 一款简单实用的桌面电子邮件客户端
- 关于生命周期函数dealloc的使用小结
- VB为MSHFlexGrid添加表格编辑功能
- 了解计算机编码的一般特征,教招信息知识点:计算机编码的一般特征
- ASP.NET开发学习视频教程大全(共800集)
- vmware workstation14密钥记录
- Samsung SSD Magician 4.1三星固态硬盘优化工具官方中文版
- Django 2.1文档
- 三星s9怎么打开开发者模式
- 牛刀小试-99乘法表
- 【文献阅读】机器学习中的超参数窃取Stealing Hyperparameters in Machine Learning
- 经纬度的多种格式和转换方式
- 新增免费根据商品条码查询商品名称API
- 计算机学院新年祝福语,学院20周年祝福语
- RFSoC应用笔记 - RF数据转换器 -04- RFSoC关键配置之RF-ADC内部解析(二)
- 简单的网络数据++分类++封装OkHttp
- 100条有效学习方法
- [简洁版]youtube-dl下载命令
- [离散数学]命题逻辑P_5:命题公式分类和等价