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

    文章

    720

    浏览量

    41344
  • 静态链接
    +关注

    关注

    0

    文章

    5

    浏览量

    5904

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

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

收藏 人收藏

    评论

    相关推荐

    动态和静态的区别

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

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

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

    请问Python中的类方法、实例方法和静态方法是什么?

    Python中的类方法、实例方法和静态方法
    发表于 11-09 07:13

    如何实现动态数码管和静态数码管?

    如何实现动态数码管和静态数码管?
    发表于 09-27 07:45

    应用程序所依赖的动态和静态没有调试信息的原因

    的原因可能有这么几个:应用程序在编译时没有指定-g选项,导致可执行程序没有调试信息。应用程序所依赖的动态和静态没有调试信息。应用程序的运行时环境没有调试信息,比如libc等。嵌入式Linux系统
    发表于 11-05 06:41

    virtuoso中进行CMOS反相器和静态寄存器的电路设计

    这篇博客记录一下virtuoso中进行CMOS反相器和静态寄存器的电路设计以及功能仿真,适合入门。还做了版图设计,但是自己对原理不是不清楚,在此就不记录了。virtuoso电路设计环境基本教学一
    发表于 11-12 06:28

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

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

    静态和动态的使用

    是一种可执行的二进制文件,是编译好的代码。使用可以提高开发效率。在 Linux 下有静态和动态
    发表于 05-04 14:08

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

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

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

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

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

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

    动态库和静态库的制作步骤

    库是一种可执行的二进制文件,是编译好的代码。使用库可以提高开发效率。在 Linux 下有静态库和动态库。 静态库在程序编译的时候会被链接到目标代码里面。所以程序在运行的时候不再需要静态
    的头像 发表于 07-27 11:00 627次阅读

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

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

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

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

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

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