0

我正在尝试编写自己的 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) 的东西,可能来自我对 std::set 的使用。这怎么可能发生?

4

1 回答 1

1

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

于 2011-08-09T08:17:46.340 回答