我不太明白这是怎么回事。我只是想在我的M1 mac上安装一个新的ruby版本,以便在一个需要与我现有的ruby版本不同的repo上运行一个简单的bundle安装。最终重新安装brew和rbenv,并最终出现以下情况。
如果我运行brew install mysql,它会成功。还有brew install openssl。
当我运行bundle install时,我会在常见的问题点上卡住:
获取mysql 2 0.5.3使用原生扩展安装mysql 2 0.5.3
我也跑得很成功
gem install mysql2 -v '0.5.3' -- --with-ldflags=-L/usr/local/opt/openssl/lib --with-cppflags=-I/usr/local/opt/openssl/include
错误是:
ld:未找到体系结构x86_64的符号
如果我运行gcc -v,我得到
Apple clang version 14.0.0 (clang-1400.0.29.202).
Target: arm64-apple-darwin22.3.0.
Thread model: posix.
InstalledDir: /Library/Developer/CommandLineTools/usr/bin
在此之前,我也有很多警告,其中包括:
linking shared-object mysql2/mysql2.bundle
ld: warning: directory not found for option '-L/usr/local/opt/openssl/lib'
ld: warning: directory not found for option '-L/usr/local/opt/ruby/lib'
ld: warning: ignoring file /opt/homebrew/lib/libzstd.dylib, building for macOS-x86_64 but attempting to link with file built for macOS-arm64
ld: warning: ignoring file /opt/homebrew/opt/openssl@1.1/lib/libcrypto.dylib, building for macOS-x86_64 but attempting to link with file built for macOS-arm64
ld: warning: ignoring file /opt/homebrew/Cellar/mysql/8.0.32/lib/libmysqlclient.dylib, building for macOS-x86_64 but attempting to link with file built for macOS-arm64
ld: warning: ignoring file /opt/homebrew/opt/openssl@1.1/lib/libssl.dylib, building for macOS-x86_64 but attempting to link with file built for macOS-arm64
我显然错过了发生了什么事..
更新:
通过运行:
rbenv exec gem install mysql2 -- \
--with-mysql-lib=/opt/homebrew/Cellar/mysql/8.0.32/lib \
--with-mysql-dir=/opt/homebrew/Cellar/mysql/8.0.32 \
--with-mysql-config=/opt/homebrew/Cellar/mysql/8.0.32/bin/mysql_config \
--with-mysql-include=/opt/homebrew/Cellar/mysql/8.0.32/include
给了我同样的错误,但更少的警告..唯一剩下的,我不设法解决的是:
warning: ignoring file /opt/homebrew/Cellar/mysql/8.0.32/lib/libmysqlclient.dylib, building for macOS-x86_64 but attempting to link with file built for macOS-arm64
我不知道我是否走在正确的道路上。
1条答案
按热度按时间baubqpgj1#
这是人们在Apple Silicon Mac上遇到的一个常见问题,原因是误解了两个主要概念:
1)arm64 vs x86_64
Apple Silicon Mac使用
arm64
架构,如果您启用Rosetta,或使用arch -x86_64
运行命令,或者如果您尝试安装为x86_64
架构构建的gem或其他工具,则会使用x86_64
架构。您不能混合和匹配架构。例如,如果您在使用Rosetta或
arch -x86_64
时安装Homebrew,它将安装/usr/local
下的内容。但是,当以本机模式安装Homebrew时,它将安装在/opt/homebrew
下。如果你在两个地方都安装了Homebrew,并且你在原生模式下安装了
rbenv
或Ruby(arm64),你不能安装一个gem并告诉它在/usr/local
(x86_64)中查找东西。你要么必须在原生模式下使用arm64
架构做所有事情,要么使用x86_64
架构做所有事情,我根本不推荐。为了确保你有一个干净的开发环境,我建议完全删除所有的开发工具,重新开始。但是首先,尝试更新
mysql2
gem,如下面第二部分所述。如果这不能解决问题,那么我将删除/usr/local
和/opt/homebrew
下的所有内容,以及与Ruby相关的所有内容,然后从头开始重新安装所有内容。同时确保你没有使用Rosetta。你可以通过在终端中运行uname -m
和arch
来检查。它们都应该返回arm64
。如果它显示i386
或x86_64
,那么我有关闭Rosetta的分步说明。2)使用与Apple Silicon不兼容的过时gem
人们在Apple Silicon Mac上遇到的另一个非常常见的问题是无法在具有旧版本gem的现有项目中安装gem。在您的情况下,
mysql2
的0.5.3版本于2019年11月7日发布,在M1 Mac发布之前。您可以通过运行bundle outdated
来检查哪些gem已经过时,或者在rubygems.org上查找它们。这里是myslq2的页面,显示最新版本是0.5.5(适用于Apple Silicon):https://rubygems.org/gems/mysql2当gem安装失败时,首先要检查的是确保它是最新的。更新gem可以修复99%的问题。
所以,在你的例子中,一旦你有了一个在本机模式下运行的合适的Ruby开发环境,你就可以用
bundle update mysql2
更新gem。然后,如果你再次运行bundle install
,你会遇到其他安装失败,我也会更新那些gem。