检查c ++库是否有不同的stl链接来跟踪std :: vector析构函数崩溃在gcc/osx上?

tfi*_*iga 5 c++ macos linker gcc stl

所以我最近开始研究一个大型软件项目,该项目使用llvm-gcc编译器连接OSX上的几个静态和动态库.

我遇到了严重的问题.具体来说,非常简单的代码会崩溃.例如,在我的主项目中,以下代码将崩溃:

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

当退出作用域时,它会在std :: vector <unsigned int>析构函数内部崩溃,抛出一个SIGABRT,并说尚未分配正在释放的内存.特别:

malloc: *** error for object 0x135e8fc30: pointer being freed was not allocated
*** set a breakpoint in malloc_error_break to debug
Run Code Online (Sandbox Code Playgroud)

这只发生在发布版本中 - 调试版本运行正常.

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

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

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

[编辑]

这看起来像两个静态库中描述的情况的真实示例,两个不同的向量实现,链接器会做什么? 事实证明,链接器做了可怕的,可怕的事情.. :)

lee*_*777 3

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

您还应该检查您的包含路径。这似乎不太可能,但有可能#include <vector>引入非标准包含,其定义与标准库中的内容不匹配。