什么是静态链接?
C语言的编译分为四个步骤,预处理、编译、汇编、链接,其中链接又分为动态链接和静态链接。
所谓静态链接,就是把库实现的代码整合到最终的二进制文件中,这样的二进制文件会比较大,因为里面既包含了自己写的代码,又包含了调用的库的代码。
但是好处就是程序在运行的时候,不需要库的支持。
我们就用mini2440这块开发板来演示下。
开发板上的文件系统是我自己制作的,简单到只有一些基本的命令可以用,也没有移植C库。
因为动态链接程序在运行的时候需要库的支持,开发板上什么都没有。
还是同样的程序,改成静态编译。
所以有些场景下,静态链接还是挺有用的。
说到静态链接,就必须要提到静态库,因为静态链接链接的就是静态库。
如何制作静态库?
先来个hello.c,在主函数中调用print函数。
接下来就跟print.c没有关系了,把它删了也行。
编译hello.c的时候,需要使用静态编译,并且链接静态库。
最终生成的二进制文件hello,即使放在一个没有libprint.a库的环境下也能运行。
静态编译在嵌入式开发中应用很多,尤其是环境比较恶劣的情况下,有了静态编译,可以省去移植好多库。
所谓静态链接,就是把库实现的代码整合到最终的二进制文件中,这样的二进制文件会比较大,因为里面既包含了自己写的代码,又包含了调用的库的代码。
但是好处就是程序在运行的时候,不需要库的支持。
我们就用mini2440这块开发板来演示下。
开发板上的文件系统是我自己制作的,简单到只有一些基本的命令可以用,也没有移植C库。
int main()
{
printf("helloworld
");
return 0;
}
来个helloworld,先使用动态编译。
[
][ ]
然后把程序传输到开发板上,但是程序根本跑不起来。因为动态链接程序在运行的时候需要库的支持,开发板上什么都没有。
还是同样的程序,改成静态编译。
[
][ ]
再次拷贝到开发板上运行,这一次程序顺利输出了helloworld。所以有些场景下,静态链接还是挺有用的。
说到静态链接,就必须要提到静态库,因为静态链接链接的就是静态库。
如何制作静态库?
先来个hello.c,在主函数中调用print函数。
int main()
{
print();
return 0;
}
在print.c中实现print函数。
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
原文标题:静态链接和静态库
文章出处:【微信号:学益得智能硬件,微信公众号:学益得智能硬件】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
关于堆栈和静态以及动态内存的理解
全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量、未初始化的静态变量在相邻的另一块区域。 - 程序结
基本放大电路中静态值和静态工作点一样吗?
基本放大电路中静态值和静态工作点一样吗? 基本放大电路是指通常用于信号放大和增强的电路,它是电子工程中最基本的电路之一。在基本放大电路中,静态值和静态工作点都是非常重要的概念,但它们
动态电路和静态电路的区别
动态电路和静态电路的区别 动态电路和静态电路是电路的两种基本类型,它们在电子设备中的作用与应用不同。本文将详细介绍动态电路和静态电路的区别。 1. 概述 静态电路和动态电路都是电子电路
有源负载和静态负载的区别是什么?
有源负载和静态负载的区别是什么? 有源负载和静态负载是电子领域中两种常见的负载。在电路中,负载是指电路输出能力的消耗者。在这篇文章中,我们将介绍有源负载和静态负载之间的区别。 1. 有源负载
评论