网站首页

人工智能P2P分享搜索全网发布信息网站地图标签大全

当前位置:诺佳网 > 电子/半导体 > 嵌入式技术 >

静态链接和静态库

时间:2023-02-08 14:17

人气:

作者:admin

标签: 二进制  静态链接 

导读:所谓静态链接,就是把库实现的代码整合到最终的二进制文件中,这样的二进制文件会比较大,因为里面既包含了自己写的代码,又包含了调用的库的代码。...
什么是静态链接? 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库的环境下也能运行。
静态编译在嵌入式开发中应用很多,尤其是环境比较恶劣的情况下,有了静态编译,可以省去移植好多库。


审核编辑 :李倩


温馨提示:以上内容整理于网络,仅供参考,如果对您有帮助,留下您的阅读感言吧!
相关阅读
本类排行
相关标签
本类推荐

CPU | 内存 | 硬盘 | 显卡 | 显示器 | 主板 | 电源 | 键鼠 | 网站地图

Copyright © 2025-2035 诺佳网 版权所有 备案号:赣ICP备2025066733号
本站资料均来源互联网收集整理,作品版权归作者所有,如果侵犯了您的版权,请跟我们联系。

关注微信