g++编译命令行参数源文件和库文件位置不能互换

1、当前目录下有librestyhash.a 和 main.cpp,编译时必须g++ -Wall -g -o main.cpp librestyhash.a,为什么main.cpp和librestyhash.a不能交换?
 

编译器在生成可执行文件时需要符号解析。这里的符号是全局变量和全局函数,会为每个外部符号找到它的定义(比如,extern int a,要在本文件或者别的源文件中找到它的定义int a)。
为了完成这个任务,编译器在将重定位目标文件(*.o)和库文件连接成可执行文件的时候会维护3个集合。
1、可重定位目标文件集合A,就是.o文件。
2、没有解析外部符号集合B。
3、前面可重定位目标文件已定义的全局符号集合C。
编译器是按照命令行参数从左至右解析的,首先判断参数是可重定位目标文件还是库文件,如果是可重定位目标文件,
如果是可定位目标文件就加入到集合A,其次找出所有全局变量,更新B和C。如果是库文件,就根据集合B中没有解析的外部
符号,开始查找库文件中的符号定义,如果包含B中外部符号的定义,就把它加入A,接着更新B和C。就这样把命令行
的参数处理完。如果此时B中有没有解析的外部符号,编译就会报错:"有未定义的符号"。否则就会成功生成可执行文件。
main函数里面含有librestyhash.a中的全局变量,main在前面,把引用的外部符号加入B中,接着扫描librestyhash.a在里面的一个可重定位目标文件中找到这些符号的定义,就会与这个可重定位目标文件一起链接。
交换位置之后,main中在librestyhash.a中定义的外部符号就找不到它的定义,编译出错。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值