0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

静态链接和静态库

学益得智能硬件 来源:学益得智能硬件 2023-02-08 14:17 次阅读
什么是静态链接? C语言的编译分为四个步骤,预处理、编译、汇编、链接,其中链接又分为动态链接和静态链接。
所谓静态链接,就是把库实现的代码整合到最终的二进制文件中,这样的二进制文件会比较大,因为里面既包含了自己写的代码,又包含了调用的库的代码。
但是好处就是程序在运行的时候,不需要库的支持。
我们就用mini2440这块开发板来演示下。
61977146-a777-11ed-bfe3-dac502259ad0.png  开发板上的文件系统是我自己制作的,简单到只有一些基本的命令可以用,也没有移植C库。
#include 


int main()
{
    printf("helloworld
");


    return 0;
}

来个helloworld,先使用动态编译。
[root@turbo ~]# arm-linux-gcc test.c -o test


[root@turbo ~]#
然后把程序传输到开发板上,但是程序根本跑不起来。
61e378a2-a777-11ed-bfe3-dac502259ad0.png  因为动态链接程序在运行的时候需要库的支持,开发板上什么都没有。
还是同样的程序,改成静态编译。
[root@turbo ~]# arm-linux-gcc test.c -o test -static


[root@turbo ~]#

再次拷贝到开发板上运行,这一次程序顺利输出了helloworld。
62019ea4-a777-11ed-bfe3-dac502259ad0.png  所以有些场景下,静态链接还是挺有用的。
说到静态链接,就必须要提到静态库,因为静态链接链接的就是静态库。
如何制作静态库?
先来个hello.c,在主函数中调用print函数。
#include 


int main()
{
print();
    return 0;
}
在print.c中实现print函数。
#include 


void print()
{
    printf("this is test ...
");
}
第一步,对print.c做汇编操作。
gcc -c print.c
会自动生成print.o。然后把print.o做成静态库。
ar -crv libprint.a print.o
这里的libprint.a就是最终生成的静态库。
接下来就跟print.c没有关系了,把它删了也行。

编译hello.c的时候,需要使用静态编译,并且链接静态库。
gcc hello.c -o hello -static -lprint -L .
参数有点多,static表示静态编译,小写的l表示库的名字,大写的L表示库的路径。
最终生成的二进制文件hello,即使放在一个没有libprint.a库的环境下也能运行。
静态编译在嵌入式开发中应用很多,尤其是环境比较恶劣的情况下,有了静态编译,可以省去移植好多库。


审核编辑 :李倩


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 二进制
    +关注

    关注

    2

    文章

    793

    浏览量

    41593
  • 静态链接
    +关注

    关注

    0

    文章

    5

    浏览量

    5924

原文标题:静态链接和静态库

文章出处:【微信号:学益得智能硬件,微信公众号:学益得智能硬件】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    静态链接和动态链接

    一、静态链接静态链接通过静态进行链接,生成的目标程
    发表于 08-27 10:20

    动态和静态的区别

    .so区分一个概念:是包含前缀lib以及后缀.a或者.so的一个整体名是去掉前缀和后缀剩下的部分四、动态和静态的特点
    发表于 05-26 17:22

    Linux下动态和静态的制作及使用

    可执行代码的二进制格式,可以被载入内存中执行。根据链接时期的不同,又有:静态和共享(动态
    发表于 11-18 17:05

    静态的优点及其静态的使用解析

    一、静态优点:运行快,发布程序无需提供静态,因为已经在app中,移植方便缺点:更新慢 繁琐1、静态
    发表于 02-17 07:45

    课题三_基本共射极放大电路的组成和静态分析(2学时)

    基本共射极放大电路的组成和静态分析基本共射极放大电路的组成和静态分析
    发表于 11-13 17:00 0次下载

    你知道linux 静态和共享

    静态链接库和动态链接库的区别在于,主程序在运行前,静态链接库链接固定写入在程序中,而动态
    发表于 04-26 16:46 2882次阅读

    关于堆栈和静态以及动态内存的理解

    全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量、未初始化的静态变量在相邻的另一块区域。 - 程序结
    的头像 发表于 05-03 14:12 2629次阅读

    GCC程序编译的静态链接和动态链接

    静态链接使用静态进行链接,生成的程序包含程序运行所需要的全部,可以直接运行,不过
    的头像 发表于 11-12 15:50 2611次阅读
    GCC程序编译的<b class='flag-5'>静态</b><b class='flag-5'>链接</b>和动态<b class='flag-5'>链接</b>

    讲解Linux虚拟机之使用动态和静态

    了解 Linux 如何使用,包括静态和动态的差别,有助于你解决依赖问题。
    发表于 05-06 17:05 2159次阅读
    讲解Linux虚拟机之使用动态<b class='flag-5'>库</b><b class='flag-5'>和静态</b><b class='flag-5'>库</b>

    嵌入式Linux下动态和静态使用

    以下主要介绍Linux 下动态静态、如何使用已有的动态, 以及如何制作一个动态。Linux下的动态
    发表于 11-01 16:57 1次下载
    嵌入式Linux下动态<b class='flag-5'>库</b><b class='flag-5'>和静态</b><b class='flag-5'>库</b>使用

    Linux下动态和静态制作与调用

    静态是指在应用中,有一些公共代码需要反复使用,就把这些代码编译为“”文件;在链接步骤中,连接器将从文件取得所需的代码,复制到生成的可执
    的头像 发表于 08-24 15:03 3691次阅读
    Linux下动态<b class='flag-5'>库</b><b class='flag-5'>和静态</b><b class='flag-5'>库</b>制作与调用

    动态和静态的制作步骤

    是一种可执行的二进制文件,是编译好的代码。使用可以提高开发效率。在 Linux 下有静态和动态
    的头像 发表于 07-27 11:00 782次阅读

    基本放大电路中静态和静态工作点一样吗?

    基本放大电路中静态和静态工作点一样吗?  基本放大电路是指通常用于信号放大和增强的电路,它是电子工程中最基本的电路之一。在基本放大电路中,静态和静态工作点都是非常重要的概念,但它们
    的头像 发表于 09-13 14:17 1755次阅读

    动态电路和静态电路的区别

    动态电路和静态电路的区别 动态电路和静态电路是电路的两种基本类型,它们在电子设备中的作用与应用不同。本文将详细介绍动态电路和静态电路的区别。 1. 概述 静态电路和动态电路都是电子电路
    的头像 发表于 09-17 10:47 4607次阅读

    有源负载和静态负载的区别是什么?

    有源负载和静态负载的区别是什么?  有源负载和静态负载是电子领域中两种常见的负载。在电路中,负载是指电路输出能力的消耗者。在这篇文章中,我们将介绍有源负载和静态负载之间的区别。 1. 有源负载
    的头像 发表于 09-18 18:20 1531次阅读