【发布时间】:2021-12-08 19:13:02
【问题描述】:
我正在使用代码在我的服务器应用程序中包含 rapidjson 标头。
当我编译时,它是好的。但是当应用程序中的一些其他库部分正在运行时,它被 gdb 核心文件证明是死的。
#0 0x00007f36c614e922 in rapidjson::MemoryPoolAllocator<rapidjson::CrtAllocator>::Malloc (this=0x7f36a4037700, size=256) at ../../common/include/rapidjson/allocators.h:321
321 RAPIDJSON_NOEXCEPT_ASSERT(shared_->refcount > 0);
...
#17 0x00007f36c57999cb in dbgw::sql::NBaseTPreparedStatement::executeQuery (this=<optimized out>) at ../../src/dbgw/dbgw3/sql/nbase_t/NBaseTPreparedStatement.cpp:85
我意识到动态库实际上已经有rapidjson
在我看到下面这个之后,我通过将命名空间添加到新添加的rapidjson 来解决
所以我很好奇的是……
Q1.这是因为多个包含违反了 ODR,共享库意外(因为覆盖符号的东西)运行了新添加的(可能是不同版本的)rapidjson 代码,并导致抛出异常?
第二季度。我可以假设编译时没有发生previous declaration 错误的原因是它是“共享”库并且仅在应用程序运行时才链接?(与静态库不同)
【问题讨论】:
标签: c++ gdb shared-libraries coredump one-definition-rule