c++ - 尝试加载自定义 mysql 插件时 undefined reference - 如何调试?

标签 c++ mysql dlopen

我正在尝试编写自己的 MySQL 存储引擎,它使用键值存储作为后端。

我现在编写了我的第一个版本,它实现了强制性部分,并且我能够编译、链接和安装我的 MySQL 源实例。这样做之后,我尝试在 mysql 控制台中使用以下命令加载我的新插件:

install plugin ramcloud soname 'ha_ramcloud.so';

我得到的错误如下:

ERROR 1126 (HY000): Can't open shared library '/usr/local/mysql/lib/plugin/ha_ramcloud.so' (errno: 13 undefined symbol: _ZNSt8_Rb_treeImmSt9_IdentityImESt4lessImESaImEE8_M_eraseEPSt13_Rb_tree_nodeImE)

现在我不知道如何调试这个问题。来自键值存储的客户端库使用 -std=c++0x 编译器标志,我开始认为这可能是问题的一部分。但是当我检查 ldd 时,我的存储引擎链接到与 mysql 提供的其他引擎相同的 libstdc++ 版本,可以毫无问题地加载。

有什么技巧可以找出问题的根源吗?

编辑:找不到的符号是

std::_Rb_tree<unsigned long, unsigned long, std::_Identity<unsigned long>, std::less<unsigned long>, std::allocator<unsigned long> >::_M_erase(std::_Rb_tree_node<unsigned long>*)

这看起来像是来自 libstdc++ (STL) 的东西,可能来 self 对 std::set 的使用。怎么会这样?

最佳答案

这是一个愚蠢的错误:MySQL 构建系统使用了 -fno-implicit-templates 选项。为我的插件删除它解决了这个问题(我也可以创建一个显式实例,但由于我只编写了一个原型(prototype),所以这应该没问题)。

关于c++ - 尝试加载自定义 mysql 插件时 undefined reference - 如何调试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6992768/

相关文章:

mysql - 如何从 EC2 ubuntu 系统连接到本地的 Mysql?

mysql - 使用mysql查询大表

c++ - 如何将函数值更改为 C++ 中表( Gamma 分布)中的值?

c++ - 将 struct 写入文件时写入了太多字节

mysql - 如何在不直接访问数据库的情况下修改MySQL表结构?

c - _dl_close 断言失败

c++ - 在运行时检查 C++ 共享依赖项(ldd on self)

c++ - dlopen 的库如何解析其 undefined symbol ?

c++ - 用一个程序创建多个链表

c++ - C++ 中的悬空指针和删除命令