g++ 链接时 .o文件顺序问题

coderchenjingui 2013-11-08 11:43:28
问题是这样的。
有两个cpp,假设为A.CPP和B.CPP,这两个cpp里面都定义了一个static全局指针,

makefile中
链接A.o和B.o的时候,如果A.o放在B.o前面,那么B.o里面的static全局指针变量不可用,是个野指针。
如果链接时,B.o放在A.o前面,就不会有问题。

想不明白,我知道可以通过函数返回static local变量替代全局变量,这肯定不会出问题。
但是我更想知道为什么链接顺序不一致,会出问题呢?
...全文
569 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
todd_leftcode 2013-11-11
  • 打赏
  • 举报
回复
代码量很大不方便贴,那肯定也不方便排查。 写一个简单的小测试,先证实下是不是链接顺序问题。
coderchenjingui 2013-11-11
  • 打赏
  • 举报
回复
引用 10 楼 todd_leftcode 的回复:
代码量很大不方便贴,那肯定也不方便排查。 写一个简单的小测试,先证实下是不是链接顺序问题。
恩,问题已查证了。是全局变量的问题。其中一个文件内定义了一个未初始化的数组,链接的时候把下一个文件的指针位置覆盖了。 长教训了,慎用全局变量。
mujiok2003 2013-11-08
  • 打赏
  • 举报
回复
具体出了什么问题?
coderchenjingui 2013-11-08
  • 打赏
  • 举报
回复
引用 1 楼 turingo 的回复:
应该不存在你所说的问题,可能是你的static全局指针变量没有初始化,最好贴上代码。 [quote=引用 楼主 QQ575787460 的回复:] 问题是这样的。 有两个cpp,假设为A.CPP和B.CPP,这两个cpp里面都定义了一个static全局指针, makefile中 链接A.o和B.o的时候,如果A.o放在B.o前面,那么B.o里面的static全局指针变量不可用,是个野指针。 如果链接时,B.o放在A.o前面,就不会有问题。 想不明白,我知道可以通过函数返回static local变量替代全局变量,这肯定不会出问题。 但是我更想知道为什么链接顺序不一致,会出问题呢?
[/quote] 每个文件都被编译成.o文件之后, 我手动链接了2次,一次A.o在B.o之前,出问题 另一次B.o在A.o之前,没有出问题。
coderchenjingui 2013-11-08
  • 打赏
  • 举报
回复
引用 1 楼 turingo 的回复:
应该不存在你所说的问题,可能是你的static全局指针变量没有初始化,最好贴上代码。 [quote=引用 楼主 QQ575787460 的回复:] 问题是这样的。 有两个cpp,假设为A.CPP和B.CPP,这两个cpp里面都定义了一个static全局指针, makefile中 链接A.o和B.o的时候,如果A.o放在B.o前面,那么B.o里面的static全局指针变量不可用,是个野指针。 如果链接时,B.o放在A.o前面,就不会有问题。 想不明白,我知道可以通过函数返回static local变量替代全局变量,这肯定不会出问题。 但是我更想知道为什么链接顺序不一致,会出问题呢?
[/quote] 代码量很大,单独摘出来没有多大用。我测试好多次了,调整链接顺序,程序结果就不一样。
图灵狗 2013-11-08
  • 打赏
  • 举报
回复
应该不存在你所说的问题,可能是你的static全局指针变量没有初始化,最好贴上代码。
引用 楼主 QQ575787460 的回复:
问题是这样的。 有两个cpp,假设为A.CPP和B.CPP,这两个cpp里面都定义了一个static全局指针, makefile中 链接A.o和B.o的时候,如果A.o放在B.o前面,那么B.o里面的static全局指针变量不可用,是个野指针。 如果链接时,B.o放在A.o前面,就不会有问题。 想不明白,我知道可以通过函数返回static local变量替代全局变量,这肯定不会出问题。 但是我更想知道为什么链接顺序不一致,会出问题呢?
coderchenjingui 2013-11-08
  • 打赏
  • 举报
回复
引用 8 楼 ri_aje 的回复:
[quote=引用 6 楼 QQ575787460 的回复:] [quote=引用 4 楼 mujiok2003 的回复:] 具体出了什么问题?
static全局指针变量初始化出问题了,成了野指针。[/quote] static 静态初始化为 0,即便链接问题导致动态初始化出问题,也不会成为野指针啊。 在该 static 指针上设内存断点,调试一下看看是谁最后把它修改成野指针的。[/quote] 恩。多谢。
ri_aje 2013-11-08
  • 打赏
  • 举报
回复
引用 6 楼 QQ575787460 的回复:
[quote=引用 4 楼 mujiok2003 的回复:] 具体出了什么问题?
static全局指针变量初始化出问题了,成了野指针。[/quote] static 静态初始化为 0,即便链接问题导致动态初始化出问题,也不会成为野指针啊。 在该 static 指针上设内存断点,调试一下看看是谁最后把它修改成野指针的。
coderchenjingui 2013-11-08
  • 打赏
  • 举报
回复
引用 5 楼 turingo 的回复:
链接顺序出问题只是表象,本质上肯定不是这里的问题,因为static变量并不会导出符号,对于链接器来讲是不可见的,绝对不会影响到。所以你应该查查其它方面的问题,比如未初始化,指针数组访问越界或者堆栈溢出等等。 [quote=引用 3 楼 QQ575787460 的回复:] [quote=引用 1 楼 turingo 的回复:] 应该不存在你所说的问题,可能是你的static全局指针变量没有初始化,最好贴上代码。 [quote=引用 楼主 QQ575787460 的回复:] 问题是这样的。 有两个cpp,假设为A.CPP和B.CPP,这两个cpp里面都定义了一个static全局指针, makefile中 链接A.o和B.o的时候,如果A.o放在B.o前面,那么B.o里面的static全局指针变量不可用,是个野指针。 如果链接时,B.o放在A.o前面,就不会有问题。 想不明白,我知道可以通过函数返回static local变量替代全局变量,这肯定不会出问题。 但是我更想知道为什么链接顺序不一致,会出问题呢?
[/quote] 每个文件都被编译成.o文件之后, 我手动链接了2次,一次A.o在B.o之前,出问题 另一次B.o在A.o之前,没有出问题。[/quote][/quote] 恩,这个问题很纠结,正在排查。
coderchenjingui 2013-11-08
  • 打赏
  • 举报
回复
引用 4 楼 mujiok2003 的回复:
具体出了什么问题?
static全局指针变量初始化出问题了,成了野指针。
图灵狗 2013-11-08
  • 打赏
  • 举报
回复
链接顺序出问题只是表象,本质上肯定不是这里的问题,因为static变量并不会导出符号,对于链接器来讲是不可见的,绝对不会影响到。所以你应该查查其它方面的问题,比如未初始化,指针数组访问越界或者堆栈溢出等等。
引用 3 楼 QQ575787460 的回复:
[quote=引用 1 楼 turingo 的回复:] 应该不存在你所说的问题,可能是你的static全局指针变量没有初始化,最好贴上代码。 [quote=引用 楼主 QQ575787460 的回复:] 问题是这样的。 有两个cpp,假设为A.CPP和B.CPP,这两个cpp里面都定义了一个static全局指针, makefile中 链接A.o和B.o的时候,如果A.o放在B.o前面,那么B.o里面的static全局指针变量不可用,是个野指针。 如果链接时,B.o放在A.o前面,就不会有问题。 想不明白,我知道可以通过函数返回static local变量替代全局变量,这肯定不会出问题。 但是我更想知道为什么链接顺序不一致,会出问题呢?
[/quote] 每个文件都被编译成.o文件之后, 我手动链接了2次,一次A.o在B.o之前,出问题 另一次B.o在A.o之前,没有出问题。[/quote]

64,643

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧