M2芯片迁移后运行rails s遇mysql2报错_symbol not found求助
M2芯片迁移后Rails启动mysql2符号缺失问题解决
环境信息
- Rails:7.0.3
- MySQL:5.7.29
- Ruby:3.1.1
- Rvm:1.29.12
- mysql2:0.5
报错详情
执行rails s时触发错误:
require': dlopen(/Users/list/.rvm/rubies/ruby-3.1.1/lib/ruby/gems/3.1.0/gems/mysql2-0.5.4/lib/mysql2/mysql2.bundle, 0x0009): symbol not found in flat namespace (_mysql_affected_rows)
已尝试的无效操作
- 配置bundle编译参数:
bundle config build.mysql2 "--with-ldflags=-L/usr/local/mysql/lib --with-cppflags=-I/usr/local/mysql/include" - 指定参数重新安装mysql2:
gem install mysql2 -v '0.5' -- --with-mysql-config=/usr/local/mysql/bin/mysql_config --with-ldflags="-L/usr/local/mysql/lib -L$(brew --prefix openssl)/lib" --with-cppflags=-I$(brew --prefix openssl)/include
可行解决方案
1. 替换为ARM架构适配的MySQL版本
MySQL 5.7.29默认可能无原生ARM包,卸载现有版本后从源码编译安装:
brew uninstall mysql@5.7 brew install openssl@1.1 brew install mysql@5.7 --build-from-source
2. 清理旧配置,重新编译安装mysql2
先清除之前的bundle编译配置:
bundle config unset build.mysql2
再用适配的路径参数安装mysql2:
gem install mysql2 -v '0.5.4' -- --with-mysql-config=$(brew --prefix mysql@5.7)/bin/mysql_config --with-ldflags="-L$(brew --prefix mysql@5.7)/lib -L$(brew --prefix openssl@1.1)/lib" --with-cppflags="-I$(brew --prefix mysql@5.7)/include -I$(brew --prefix openssl@1.1)/include"
最后更新项目依赖:
bundle install
3. 确保Ruby为ARM架构编译版本
检查当前Ruby架构:
ruby -e "puts RUBY_PLATFORM"
若输出不是arm64-darwinXX,重新编译Ruby:
rvm uninstall ruby-3.1.1 rvm install ruby-3.1.1 --with-openssl-dir=$(brew --prefix openssl@1.1)
4. 验证动态库链接正确性
检查mysql2.bundle的依赖库路径:
otool -L /Users/list/.rvm/rubies/ruby-3.1.1/lib/ruby/gems/3.1.0/gems/mysql2-0.5.4/lib/mysql2/mysql2.bundle
确认输出中的MySQL和OpenSSL库路径均为ARM版本的安装路径。
内容的提问来源于stack exchange,提问作者zxl
相关产品推荐
相关产品推荐

