g++ 链接时 .o文件顺序有关问题
g++ 链接时 .o文件顺序问题
问题是这样的。
有两个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变量替代全局变量,这肯定不会出问题。
但是我更想知道为什么链接顺序不一致,会出问题呢?
------解决方案--------------------
应该不存在你所说的问题,可能是你的static全局指针变量没有初始化,最好贴上代码。
------解决方案--------------------
具体出了什么问题?
------解决方案--------------------
链接顺序出问题只是表象,本质上肯定不是这里的问题,因为static变量并不会导出符号,对于链接器来讲是不可见的,绝对不会影响到。所以你应该查查其它方面的问题,比如未初始化,指针数组访问越界或者堆栈溢出等等。
------解决方案--------------------
static 静态初始化为 0,即便链接问题导致动态初始化出问题,也不会成为野指针啊。
在该 static 指针上设内存断点,调试一下看看是谁最后把它修改成野指针的。
------解决方案--------------------
代码量很大不方便贴,那肯定也不方便排查。 写一个简单的小测试,先证实下是不是链接顺序问题。
问题是这样的。
有两个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变量替代全局变量,这肯定不会出问题。
但是我更想知道为什么链接顺序不一致,会出问题呢?
makefile
链接器
------解决方案--------------------
应该不存在你所说的问题,可能是你的static全局指针变量没有初始化,最好贴上代码。
------解决方案--------------------
具体出了什么问题?
------解决方案--------------------
链接顺序出问题只是表象,本质上肯定不是这里的问题,因为static变量并不会导出符号,对于链接器来讲是不可见的,绝对不会影响到。所以你应该查查其它方面的问题,比如未初始化,指针数组访问越界或者堆栈溢出等等。
------解决方案--------------------
具体出了什么问题?
static全局指针变量初始化出问题了,成了野指针。
static 静态初始化为 0,即便链接问题导致动态初始化出问题,也不会成为野指针啊。
在该 static 指针上设内存断点,调试一下看看是谁最后把它修改成野指针的。
------解决方案--------------------
代码量很大不方便贴,那肯定也不方便排查。 写一个简单的小测试,先证实下是不是链接顺序问题。