文章目录

  • 一、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)相关推荐

  1. 【Linux学习】动态库和静态库

    目录 一.动静态库的概念和原理 1. 认识动静态库 2. 动静态库的概念 3. 动静态库的原理 二.动静态库的生成与打包 1. 静态库的生成与打包 2. 动态库的生成与打包 三.动静态库的使用 1. ...

  2. gcc g++ Linux下动态库_静态库

    关于Unix静态库和动态库的分析 基本概念 库有动态与静态两种,动态通常用.so为后缀,静态用.a为后缀. 例如:libhello.so libhello.a 为了在同一系统中使用不同版本的库,可以在 ...

  3. [学习备忘录]Linux平台静态库、动态库的一些笔记

    先声明几点: 1.操作系统:linux(fc9).编译器:gcc-4.3.0.编辑器:包括但不限于emacs.vim.这些无理由也不应造成限制. 2.生成的可执行文件名称比较有规律,仅仅是为了演示的方 ...

  4. 在Linux下如何使用GCC编译程序、简单生成静态库及动态库。

    在Linux下如何使用GCC编译程序.简单生成 静态库及动态库.   本文适用于Linux下开发初学者.本文初步讲解在Linux下如何使用GCC编译程序.简单生成静态库及动态库. 一.关于安装.一般系 ...

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

    文章目录 一.linux下gcc生成静态库和动态库以及库文件的使用 1.准备过程 2.静态库的创建及使用 (1)创建静态库 (2)程序中使用静态库 3.动态库的创建及使用 (1)创建动态库 (2)程序 ...

  6. cmake学习(一)静态库与动态库构建

    (.so)共享库,shared object:节省空间,在运行时去连接,如果执行机器上没有这些库文件就不能执行. (.a)静态库,archive:静态库和程序化为一体,不会分开. 通过 ldd命令可以 ...

  7. 【Linux】动态库与静态库

    动态库与静态库 文件系统补完 文件的三个时间acm 动态库与静态库 动态链接与静态链接 静态库与动态库 动静态库的对比 生成静态库 打包静态库 使用静态库 生成动态库 打包动态库 使用动态库 文件系统 ...

  8. 技巧:Linux 动态库与静态库制作及使用详解

    http://www.ibm.com/developerworks/cn/linux/l-cn-linklib/ 技巧:Linux 动态库与静态库制作及使用详解 标准库的三种连接方式及静态库制作与使用 ...

  9. 【Linux】动态库与静态库,如何打包库,如何使用第三方库

    文章目录 回顾基础 学会打包自己的库并使用 静态库 打包库 第三方库的使用 动态库 打包库 第三方库的使用 动态库加载以及周边问题 回顾基础 这篇文章主要对动静态库进行进一步的学习,关于动静态库的一些 ...

  10. linux代码动态分析软件,举例分析Linux动态库和静态库

    函数库分为静态库和动态库两种.创建Linux静态库和Linux动态库和使用它们在这里将以举例的形式详述一下.静态库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库.动态库在程序编译时并不 ...

最新文章

  1. 反应式服务中的线程本地状态可用性
  2. 一款简单实用的桌面电子邮件客户端
  3. 关于生命周期函数dealloc的使用小结
  4. VB为MSHFlexGrid添加表格编辑功能
  5. 了解计算机编码的一般特征,教招信息知识点:计算机编码的一般特征
  6. ASP.NET开发学习视频教程大全(共800集)
  7. vmware workstation14密钥记录
  8. Samsung SSD Magician 4.1三星固态硬盘优化工具官方中文版
  9. Django 2.1文档
  10. 三星s9怎么打开开发者模式
  11. 牛刀小试-99乘法表
  12. 【文献阅读】机器学习中的超参数窃取Stealing Hyperparameters in Machine Learning
  13. 经纬度的多种格式和转换方式
  14. 新增免费根据商品条码查询商品名称API
  15. 计算机学院新年祝福语,学院20周年祝福语
  16. RFSoC应用笔记 - RF数据转换器 -04- RFSoC关键配置之RF-ADC内部解析(二)
  17. 简单的网络数据++分类++封装OkHttp
  18. 100条有效学习方法
  19. [简洁版]youtube-dl下载命令
  20. [离散数学]命题逻辑P_5:命题公式分类和等价

热门文章

  1. Java初学者 搭建Java 开发环境
  2. 组合数问题(NOIP2016提高组Day2T1)
  3. padbineditor.php,《智龙迷城》padBinEditor修改器教学
  4. A simple test
  5. ZYNQ学习之路5.扩展PL端串口
  6. HTML+CSS练习——实现京东登录静态页面
  7. 本周最新文献速递20220327
  8. 牛客网C++开发面试经验汇总
  9. 软件资格证考试——初级程序员
  10. 香橙派3LTS部署ROS2阿克曼开源平台