2012-04-03 69 views
5

因此,我最近开始使用llvm-gcc编译器开发一个大型软件项目,该项目链接OSX上的多个静态和动态库。检查不同stl链接的C++库来追踪gcc/osx上的std :: vector析构函数崩溃?

我遇到了严重的问题。具体来说,非常简单的代码会崩溃。举例来说,在我的主要项目,下面的代码会崩溃:

{ 
    std::vector< unsigned int > testvec; 
    testvec.resize(1); 
    testvec[0] = 0; 
} 

退出时的范围,内部的std ::矢量< unsigned int类型>的析构函数,投掷SIGABRT和说,记忆就会死机被解除分配尚未分配。具体来说:

malloc: *** error for object 0x135e8fc30: pointer being freed was not allocated 
*** set a breakpoint in malloc_error_break to debug 

这只发生在发布版本 - 调试版本工作得很好。

我最好的猜测是其中一个外部库与另一个使用不同内部内存布局的STL版本链接,所以它试图释放大小或类似的东西。

我已经在我链接的所有库上运行nm,并且它们中的一些具有外部stl符号(具体来说,std :: vector < unsigned int>析构函数在nm输出中标记为S) 。但我无法弄清楚哪一个是罪魁祸首。

有没有办法检查.a或dylib文件来追踪哪些链接到不同版本的STL?

[编辑]

这看起来像在Two static libs, two different vector implementations, what would the linker do?上述情况的真实世界的例子,事实证明,链接器不可怕,可怕的事情.. :)

+1

如果您通过析构函数调用通过机器指令来执行,该怎么办?你最终会在哪个图书馆里面? – 2012-04-03 23:41:27

+0

@ZanLynx谢谢,我最终在一个与不同库链接的小项目中加入了新的操作符,最后将其缩小为从构造函数返回不同值的那个。 – tfinniga 2012-04-04 16:15:23

回答

2

我相信otool -L是你正在寻找。这将列出程序使用的共享库。

你也应该看看你的包含路径。这似乎不太可能,但#include <vector>可能会拉入非标准包含,其定义与标准库中的不一致。