所以我最近开始研究一个大型软件项目,它使用 llvm-gcc 编译器在 OSX 上链接了几个静态和动态库。
我对 stl 有严重的问题。具体来说,非常简单的代码会崩溃。例如,在我的主项目中,以下代码会崩溃:
{
std::vector< unsigned int > testvec;
testvec.resize( 1 );
testvec[0] = 0;
}
退出范围时,它会在 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
这只发生在发布版本中 - 调试版本工作得很好。
我最好的猜测是,其中一个外部库与另一个使用不同内部存储器布局的 STL 版本相关联,因此它试图释放大小或类似的东西。
我已经在我链接的所有库上运行了 nm,其中一些库具有外部 stl 符号(具体来说,std::vector< unsigned int > 析构函数在 nm 输出中用 S 标记)。但我不知道哪一个是罪魁祸首。
有没有办法检查 .a 或 dylib 文件以追踪哪些文件链接到不同版本的 STL?
[编辑]
这看起来像是两个静态库,两个不同的向量实现中描述的情况的真实示例,链接器会做什么? 事实证明,链接器做了可怕、可怕的事情.. :)