编译MySQL UDF时GCC无法链接RHash的问题求助
解决MySQL UDF加载
sha3.so时报undefined symbol: rhash_msg的问题 我之前也踩过这个一模一样的坑!这个错误本质是你的sha3.so没有正确链接到RHash的库文件,导致MySQL加载时找不到rhash_msg这个核心符号。下面是我亲测有效的解决步骤:
1. 确保RHash正确安装并被系统识别
首先得确认你编译安装的RHash已经被系统库缓存收录:
- 重新编译RHash源码时,执行配置命令要同时启用静态和动态库:
./configure --enable-static --enable-shared make && sudo make install - 安装完成后必须执行
sudo ldconfig,更新系统的共享库缓存,这样后续编译UDF时才能找到RHash的库。
2. 编译UDF时显式链接RHash库
这是最关键的一步!很多人编译UDF时只加了MySQL的头文件,却忘了链接RHash的库:
假设你的UDF源码文件是sha3_udf.c,编译命令要加上-lrhash参数:
# 第一步:编译成目标文件 gcc -fPIC -Wall -I$(mysql_config --include) -c sha3_udf.c # 第二步:生成共享库,重点是-lrhash gcc -shared -o sha3.so sha3_udf.o -lrhash
如果RHash安装在非默认路径(比如/usr/local/lib),还要加上-L参数指定库路径:
gcc -shared -o sha3.so sha3_udf.o -L/usr/local/lib -lrhash
3. 验证共享库的依赖是否正确
编译完成后,用ldd命令检查sha3.so的依赖:
ldd sha3.so
如果输出里能看到librhash.so的条目,说明链接成功了;如果看不到,就得回头检查RHash的安装路径和编译参数。
4. 重新部署UDF并测试
- 把编译好的
sha3.so复制到MySQL插件目录(你的路径是/usr/lib/mysql/plugin/),注意权限要设置正确:sudo cp sha3.so /usr/lib/mysql/plugin/ sudo chown mysql:mysql /usr/lib/mysql/plugin/sha3.so - 登录MySQL,重新创建UDF函数(如果之前创建过要先DROP):
DROP FUNCTION IF EXISTS sha3; CREATE FUNCTION sha3 RETURNS STRING SONAME 'sha3.so'; - 测试一下函数是否能正常调用,比如:
SELECT sha3('test');
额外注意点
- 确保你的编译环境和MySQL的架构一致(比如都是64位),否则会出现加载失败的情况;
- 如果之前编译过旧版本的
sha3.so,一定要彻底替换掉旧文件,最好重启一下MySQL服务再测试。
内容的提问来源于stack exchange,提问作者Brian Leishman
相关产品推荐
相关产品推荐

