栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

(小白入门)Linux下静态库与动态库的创建及使用(使用gcc完成)案例解读~超详细

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

(小白入门)Linux下静态库与动态库的创建及使用(使用gcc完成)案例解读~超详细

(入门级)Linux下可执行程序的编译组装
  • 前言
  • 一、Linux下.a静态库与.so动态库的生成与使用(“以输出“hello XX”为例”)
    • 1.静态库与动态库的介绍
    • 2.静态库和动态库的创建
    • 3.在程序中使用静态库
    • 4.在程序中使用动态库
  • 二、举例运用
    • 1.编写主程序文件及子程序文件
    • 2.生成目标文件(.o)
    • 3.静态库与main函数的链接
      • 3.1 先将目标文件生成一个静态库(x2x&x2y)
      • 3.2 将生成的.a静态库与main函数生成可执行程序
    • 4.动态库与main函数的链接
      • 4.1 将目标文件生成动态库(x2x&x2y)
      • 4.2 将生成的.so动态库与main函数生成可执行程序
  • 三、总结


前言

在第一篇文章中,我们已经了解到使用gcc编译程序的基本过程,基本步骤详情可参考:https://blog.csdn.net/isyuuun/article/details/120281998


提示:以下是本篇文章正文内容,下面案例可供参考

一、Linux下.a静态库与.so动态库的生成与使用(“以输出“hello XX”为例”)

将一些公用函数制作成函数库以便供其他程序使用。这些函数库分为静态库和动态库两种。

1.静态库与动态库的介绍
  • 静态库在程序编译时会被连接到目标代码,程序运行时将不再需要该静态库。
  • 动态库在程序编译时不会被连接到目标代码中,而是在程序运行时才被载入,程序运行时需要动态库存在。
2.静态库和动态库的创建

(1)编写程序所需要的.c文件和.h文件
main.c

#include"hello.h"
int main()
{
hello("everyone");
return 0;
}

hello.c

#include
void hello(const char *name)
{
printf("Hello %s!n",name);
}

hello.h

#ifndef HELLO_H
define HELLO_H
void hello(const char *name);
#endif//HELLO_H

(2)生成.o文件

静态库和动态库的创建都需要.o文件创建


之后生成hello.o

3.在程序中使用静态库

(1)创建静态库(.a)
静态库的命名是以lib为前缀,紧接着跟静态库名,扩展名为.a

ls检查是否生成静态库myhello.a

(2)使用静态库

  • 将main函数和静态库一起运行
gcc main.c libmyhello.a -o hello


生成可执行程序,大小16.9kB

4.在程序中使用动态库

(1)创建动态库(.so)
动态库文件名命名规范和静态库文件名命名规范类似,也是在动态库名增加前缀lib,但文件扩展名为.so

ls检查是否生成myhello.so


生成静态库和动态库后如下:

(2)使用动态库

将main.c和libmyhello.so生成可执行程序

大小16.8kB

二、举例运用

题目要求:请编写一个主程序文件 main1.c 和一个子程序文件 sub1.c, 要求:子程序sub1.c 包含一个算术运算函数 float x2x(int a,int b),此函数功能为对两个输入整型参数做某个运算,将结果做浮点数返回;主程序main1.c,定义并赋值两整型变量,然后调用函数 x2x,将x2x的返回结果printf出来。再扩展写一个x2y函数(功能自定),main函数代码将调用x2x和x2y ;将这3个函数分别写成单独的3个 .c文件,并用gcc分别编译为3个.o 目标文件;将x2x、x2y目标文件用 ar工具生成1个 .a 静态库文件, 然后用 gcc将 main函数的目标文件与此静态库文件进行链接,生成最终的可执行程序,记录文件的大小。

1.编写主程序文件及子程序文件

main.c

#include
#include"sub1.h"
#include"sub2.h"
float x2x(int a,int b);
float x2y(int a,int b);
main()
{
float x,y;
int a,b;
printf("a="); 
scanf("%d",&a);
printf("b=");
scanf("%d",&b);
printf("a*b=%fn",x2x(a,b));
printf("a+b=%f",x2y(a,b));
}

sub1.c(乘法)

#include

float x2x(int a,int b)
{
float x;
x=a*b;
return x;
}

sub1.h

#ifndef SUB1_H
#define SUB1_H

#include

float x2x(int a,int b);  

#endif

sub2.c

#include
float x2y(int a,int b)
{
return a+b;
}

sub2.h

#ifndef SUB2_H
#define SUB2_H

#include

float x2y(int a,int b);  

#endif

2.生成目标文件(.o)

3.静态库与main函数的链接 3.1 先将目标文件生成一个静态库(x2x&x2y)


这里gcc的书写格式不再赘述,上个标题已经讲过

3.2 将生成的.a静态库与main函数生成可执行程序



文件大小如下:

4.动态库与main函数的链接 4.1 将目标文件生成动态库(x2x&x2y)


4.2 将生成的.so动态库与main函数生成可执行程序



此时文件大小如下:

三、总结

静态库和动态库存在是为了将除主函数外的其他函数放在库里,以便其他程序也可以使用。而学会使用静态库与动态库,极大的方便我们的程序实现。


参考文献:
用gcc生成静态库和动态库:https://mooc1.chaoxing.com/ueditorupload/read?objectId=dc36405faf8e7dc66d657fcc6b780cd7&fileOriName=%E7%94%A8gcc%E7%94%9F%E6%88%90%E9%9D%99%E6%80%81%E5%BA%93%E5%92%8C%E5%8A%A8%E6%80%81%E5%BA%93.pdf
“undefined reference to” 问题解决方法:https://blog.csdn.net/KgdYsg/article/details/90705766

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/311711.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号