免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 5358 | 回复: 9
打印 上一主题 下一主题

gcc(g++)编译的顺序问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-09-03 16:04 |只看该作者 |倒序浏览
其中main.cpp中有main函数,a.cpp中需要用到xxx库
g++  -o a.out main.cpp  -lxxx a.cpp b.cpp
这样编译不过,报错a.cpp中某行有undefined reference(xxx中的)。

把顺序调整一下:
g++  -o a.out main.cpp a.cpp  -lxxx b.cpp
能编过了,但是运行时coredump(main中调用了xxx中的一个空test函数,如果不掉用就不会coredump),怀疑是编译时链接地址弄错了

请教编译的顺序有什么讲究么?多谢指教。

论坛徽章:
0
2 [报告]
发表于 2010-09-03 17:06 |只看该作者
好像动态库顺序没有要求 静态库要注意调用先后顺序

论坛徽章:
0
3 [报告]
发表于 2010-09-04 08:43 |只看该作者
xxx库是什么库?
静态链接时,顺序有关系 从右往左
比如a依赖b 那么要把b放在a的右边
gcc -static -la -lb ...
如果
gcc -static -lb -la ...
否则就出现...unresolved symbols...

论坛徽章:
0
4 [报告]
发表于 2010-09-04 08:55 |只看该作者
应该是程序有问题吧。。。

论坛徽章:
0
5 [报告]
发表于 2010-09-04 13:00 |只看该作者
静态库原来从右到左,这块恶补啊!!

论坛徽章:
0
6 [报告]
发表于 2010-09-04 15:52 |只看该作者
依赖的放在被依赖的前面

论坛徽章:
2
CU十二周年纪念徽章
日期:2013-10-24 15:41:34处女座
日期:2013-12-27 22:22:41
7 [报告]
发表于 2010-09-04 19:25 |只看该作者
对,以前看过类似的帖子,自己上次试的时候也是这样。

论坛徽章:
0
8 [报告]
发表于 2010-09-04 19:53 |只看该作者
Mark! 学习了。

论坛徽章:
0
9 [报告]
发表于 2010-09-04 20:39 |只看该作者
编译器从左到右扫描,需要两个表A,B
A:里面记录了所有没有被resolve的symbol
B: 里面记录了所有需要链接的库

一开始A,B两个表都是空的
从左到右扫描的时候的过程如下
1.如果是一个obj文件,则将不能被resolve的symbol加入到A表里面
2.如果是一个库文件,则查找其中是否有A表中的symbol,如果有,则从A表中去掉该symbol(因为已经被当前库resolve了),同时将该库加入到B表中

扫描结束后如果A表非空,则会报错

现在的编译器默认都是进行一次扫描的,所以你需要将.o文件放在前面,否则你这个A表直到最后才生成,但这个时候所有的库已经扫描完了会造成A表非空


具体的可能会有些不一样,但是大体原理基本就是这样的

论坛徽章:
0
10 [报告]
发表于 2010-09-07 15:29 |只看该作者
编译器从左到右扫描,需要两个表A,B
A:里面记录了所有没有被resolve的symbol
B: 里面记录了所有需要链接 ...
churchmice 发表于 2010-09-04 20:39


多谢啦!这个最清楚明白
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP