ruby ld:捆绑包安装时未找到体系结构x86_64的符号

cunj1qz1  于 2023-04-05  发布在  Ruby
关注(0)|答案(1)|浏览(191)

我不太明白这是怎么回事。我只是想在我的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

我不知道我是否走在正确的道路上。

baubqpgj

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 -march来检查。它们都应该返回arm64。如果它显示i386x86_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。

相关问题