我正在尝试编写自己的 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/