一次c/c++静态库链接出现问题后的思考

昨天我把一个写好的程序(带有自己编写的makefile),从本地我的mac系统笔记本上传拷贝到远程的linux系统服务器上面,然后我执行make命令,结果报出大量符号“”为定义的引用,一看就是链接的问题,这个程序我在我本地的mac系统上运行过很多次了,而且我的c程序没有用到过第三方库什么的,我完全是基于c 标准库写了一个程序。mac系统是unix系统,和linux系统从根源上应该是一个东西,然后我就陷入了各种上网查找gcc如何链接静态库的makefile编写各种修改中。通过这件事我能知道我对c/c++程序编译过程的了解还不够。


1,静态库本质是什么?

静态库的本质就是多个目标文件的压缩。我们写程序的时候习惯把公共的部分抽离出到其他源文件中,经过编译就是目标文件了,但是当我们的抽离的源文件比较多,也就是目标文件也比较多的时候,不同的项目用起来,就会出现混乱,每个项目只修改自己用到的公共源文件部分,整体的公共部分会出现无法统一的情况,所以在这种情况下出现了静态库这种东西,他其实是对多个目标文件压缩成一个文件,等待链接的时候使用。他会把你提取你所需要的部分。你用压缩工具是可以看到静态库里面的东西的。

2,静态库如何使用?

了解了静态库的本质就应该知道静态库的使用应该和使用其他目标文件一样。就可以把静态库文件当成程序中一个源码文件的目标文件使用就好,如果你想把这个静态库文件放到一个指定的位置就需要用gcc参数中的-l -L ,的选项去设置了。

3,链接过程中具体都干了什么?

其实链接过程分为两步

,第一步,把每一个目标文件中,text段,data段,.bass段整合到最终程序中的,text段,data段,.bass段。一个每一个目标文件会引用其他文件中的符号,所以在每部分会有一个重定位表。然后还会把各个部分的符号放在全局符号表中。

第二步,从每部分的重定位表中取出引用的符号,去全局符号表中找到到,计算一下它应该的虚拟内存地址。进行替换一下。因为之前的值初始默认值。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。