Gem::Ext::BuildError: 错误:在 macOS Monterey 上构建本地扩展失败

3
当我在我的Rails 5项目上运行bundle install时,我会在具有本地扩展的宝石上遇到许多错误。以下是其中一个宝石输出的顶部内容:
Installing nio4r 1.2.1 with native extensions

Gem::Ext::BuildError: ERROR: Failed to build gem native extension.

checking for unistd.h... yes
checking for rb_thread_blocking_region()... no
checking for rb_thread_call_without_gvl()... yes
checking for sys/select.h... yes
checking for poll.h... yes
checking for sys/epoll.h... no
checking for sys/event.h... yes
checking for sys/queue.h... yes
checking for port.h... no
checking for sys/resource.h... yes
creating Makefile

current directory: /Users/<my-username>/.rvm/gems/ruby-2.7.4/gems/nio4r-1.2.1/ext/nio4r
make "DESTDIR=" clean

current directory: /Users/<my-username>/.rvm/gems/ruby-2.7.4/gems/nio4r-1.2.1/ext/nio4r
make "DESTDIR="
compiling monitor.c
monitor.c:91:24: warning: '(' and '{' tokens introducing statement expression appear in different macro expansion contexts [-Wcompound-token-split-by-macro]
if(interests_id == rb_intern("r")) {
                   ^~~~~~~~~~~~~~
/Users/<my-username>/.rvm/rubies/ruby-2.7.4/include/ruby-2.7.0/ruby/ruby.h:1847:23: note: expanded from macro 'rb_intern'
    __extension__ (RUBY_CONST_ID_CACHE((ID), (str))) : \
                  ^
monitor.c:91:24: note: '{' token is here
    if(interests_id == rb_intern("r")) {
                       ^~~~~~~~~~~~~~

我尝试了许多方法。
根据这篇帖子,我尝试了以下建议:
# didn't fix it
bundle config build.nio4r --with-cflags="-std=c99"
bundle

# didn't fix it
xcode-select --install
sudo xcodebuild -license accept
bundle

我还参考了Go Rails指南中的“Final Steps”部分,该部分涉及需要C扩展的gems,但由于我没有从Mojave迁移我的macOS,所以该命令似乎不适用。
目前为止,我不知道下一步该尝试什么。最终问题似乎围绕着无法安装需要C扩展的gems。
环境:
- macOS Monterey版本12.2 - 使用rvm与ruby版本2.7.4 - 项目使用rails版本5.0.1

你尝试过通过 bundle clean --force 清理你的 gem 并重新安装吗?有时候,多个 gem 版本会引起很多问题,但并不会明确显示原因。 - brcebn
嗯,@brcebn尝试了那个方法,但是出现了错误:在任何来源中都找不到activesupport-5.0.1 - Neil
我之前遇到过 bundle clean 失败的情况。我倾向于使用 rm 删除 bundle 并重新构建:rm -r vendor/bundle; bundle install(假设你的 bundle 位于 vendor/bundle)。但这并不能解决构建问题。 - JellicleCat
@Neil 我本来要告诉你,如果找不到宝石(gems),有两种可能性。一是Rvm Ruby版本的问题,二是Bundler版本的问题。你可以自己找出原因。干得好! - brcebn
2个回答

11
事实证明问题出在 Gemfile.lock 文件中,它被锁定为使用较旧版本的bundler。我们只需删除 Gemfile.lock 文件,然后重新运行 bundle 以重新生成 Gemfile.lock 文件即可解决该问题。现在在 Gemfile.lock 文件底部显示以下内容,因此它喜欢这个版本的 bundler:
BUNDLED WITH
   2.3.9

2
哦!这意味着您也更新了所有的 gem。这可能是一个重大变更。我建议永远不要删除 Gemfile.lock。 但是您的解决方案有效,有点激进,但绝对有效。 - brcebn
1
通常情况下,Bundler会警告您的bundle版本与bundle.lock不兼容。正如brcebn所说,您可能已经升级了一堆gems,并且升级解决了问题,但这可能会破坏其他东西。 - voxobscuro
这些观点确实是有效的。对我们而言,我们的Gemfile明确指定了我们想要的每个gem的“major”和“minor”版本。对于一些gems,我们甚至明确指定了我们想要的“patch”。到目前为止,这对我们来说已经起作用了。 - Neil

0

你试过这个吗?对我来说有效。

brew install openssl

gem install eventmachine -- --with-cppflags=-I/usr/local/opt/openssl@1.1/include

然后运行bundle install


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接