静态链接和静态库

描述

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


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


    return 0;
}

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


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


[root@turbo ~]#

 再次拷贝到开发板上运行,这一次程序顺利输出了helloworld。
 二进制  所以有些场景下,静态链接还是挺有用的。
 说到静态链接,就必须要提到静态库,因为静态链接链接的就是静态库。
 如何制作静态库?
 先来个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库的环境下也能运行。
 静态编译在嵌入式开发中应用很多,尤其是环境比较恶劣的情况下,有了静态编译,可以省去移植好多库。
 

 


审核编辑 :李倩

 


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

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分