无法构建 gem 原生扩展(安装 Compass)
Posted
技术标签:
【中文标题】无法构建 gem 原生扩展(安装 Compass)【英文标题】:Failed to build gem native extension (installing Compass) 【发布时间】:2014-04-27 23:50:53 【问题描述】:当我尝试安装最新版本的 compass (https://rubygems.org/gems/compass/versions/1.0.0.alpha.17) 时,我收到以下错误。
ERROR: Error installing compass:
ERROR: Failed to build gem native extension.
ERROR: Error installing compass:
ERROR: Failed to build gem native extension.
/System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/ruby extconf.rb
checking for ffi.h... no
checking for ffi.h in /usr/local/include,/usr/include/ffi... yes
checking for ffi_call() in -lffi... yes
checking for ffi_prep_closure()... yes
checking for ffi_raw_call()... no
checking for rb_thread_blocking_region()... yes
checking for rb_thread_call_with_gvl()... yes
checking for rb_thread_call_without_gvl()... yes
checking for ffi_prep_cif_var()... no
creating extconf.h
creating Makefile
make "DESTDIR=" clean
make "DESTDIR="
compiling AbstractMemory.c
compiling ArrayType.c
compiling Buffer.c
compiling Call.c
Call.c:303:5: warning: implicit declaration of function 'rb_thread_call_without_gvl' is invalid in C99 [-Wimplicit-function-declaration]
rbffi_thread_blocking_region(call_blocking_function, data, (void *) -1, NULL);
^
./Thread.h:78:39: note: expanded from macro 'rbffi_thread_blocking_region'
# define rbffi_thread_blocking_region rb_thread_call_without_gvl
^
1 warning generated.
compiling ClosurePool.c
compiling DataConverter.c
DataConverter.c:43:1: warning: control may reach end of non-void function [-Wreturn-type]
^
1 warning generated.
compiling DynamicLibrary.c
compiling ffi.c
compiling Function.c
Function.c:479:33: warning: incompatible pointer types passing 'VALUE (void *)' to parameter of type 'void *(*)(void *)' [-Wincompatible-pointer-types]
rb_thread_call_with_gvl(callback_with_gvl, &cb);
^~~~~~~~~~~~~~~~~
Function.c:102:46: note: passing argument to parameter 'func' here
extern void *rb_thread_call_with_gvl(void *(*func)(void *), void *data1);
^
Function.c:563:9: warning: implicit declaration of function 'rb_thread_call_without_gvl' is invalid in C99 [-Wimplicit-function-declaration]
rb_thread_call_without_gvl(async_cb_wait, &w, async_cb_stop, &w);
^
Function.c:738:1: warning: control reaches end of non-void function [-Wreturn-type]
^
3 warnings generated.
compiling FunctionInfo.c
compiling LastError.c
compiling LongDouble.c
compiling MappedType.c
compiling MemoryPointer.c
compiling MethodHandle.c
compiling Platform.c
compiling Pointer.c
compiling Struct.c
compiling StructByReference.c
compiling StructByValue.c
compiling StructLayout.c
compiling Thread.c
compiling Type.c
compiling Types.c
compiling Variadic.c
linking shared-object ffi_c.bundle
clang: error: unknown argument: '-multiply_definedsuppress' [-Wunused-command-line-argument-hard-error-in-future]
clang: note: this will be a hard error (cannot be downgraded to a warning) in the future
make: *** [ffi_c.bundle] Error 1
make failed, exit code 2
Gem files will remain installed in /Library/Ruby/Gems/2.0.0/gems/ffi-1.9.3 for inspection.
Results logged to /Library/Ruby/Gems/2.0.0/extensions/universal-darwin-13/2.0.0/ffi-1.9.3/gem_make.out
这里发生了什么?如何正确安装最新的指南针?
【问题讨论】:
Ruby Gem install Json fails on Mavericks and Xcode 5.1 - unknown argument: '-multiply_definedsuppress'的可能重复 请确保您的系统上有 make。 【参考方案1】:试试这个,然后再尝试安装指南针
apt-get install ruby-dev
【讨论】:
这修复了 Ubuntu 上的错误,但似乎 OP 正在使用 OSX。 在 Ubuntu 14.04 LTS 上为我修复 使用“yum install ruby-devel”在 CentOS 上工作,这是等效的。谢谢! 在一个 OSx 问题的答案中找到解决我的 Ubuntu 问题的方法很有趣。尽管如此,你得到了我的支持,因为你的回答刚刚解决了我的问题。 Tnx! 知道如何让它在 Windows 上运行吗?我使用choco install ruby2.devkit
安装了 Ruby 开发工具,但它仍然无法正常工作【参考方案2】:
为了在 Mac OS X 10.10 (Yosemite) 上安装指南针,必须执行以下操作:
1.设置 Ruby 环境
确保 ruby 已安装并且是最新的:ruby -v
更新 gem 的sudo gem update --system
2。设置 MAC 环境
安装 Xcode 命令行工具 这是安装 Compass 的关键。
xcode-select --install
安装 Xcode 命令行工具是让 Compass 在 OS X 上运行的关键
3.安装指南针
sudo gem install compass
【讨论】:
对我来说这正是正确的答案,它需要 Xcode 命令行工具 谢谢,为我工作,你是对的,Xcode 命令行工具是关键。 这对我来说有一个补充——你必须实际启动 XCODE,这样你才能接受许可协议并让它完成设置。可能值得标记到您的答案中。 通过 GUI 接受更新(协议条款)也有效。 在最近更新到 Sierra 10.12.6 的 MacBook Pro 上,我还必须运行“sudo xcodebuild -license”以接受条款和条件,然后再运行 sudo gem install compass....【参考方案3】:最好的方法是sudo apt-get install ruby-compass
安装指南针。
【讨论】:
哇,有时候很简单^^ 尝试用 gem 安装 compass,但是 gem 没有解决一些依赖关系。使用 apt-get 效果很好!谢谢【参考方案4】:你可以在 Debian 中尝试
sudo apt-get install gcc ruby-dev rubygems compass
对于 Fedora、Centos
yum -y install gcc ruby-devel rubygems compass
它对我有用。
【讨论】:
我还必须安装make
。
ruby-dev
成功了***.com/questions/20559255/…【参考方案5】:
我在同一个问题上挣扎了大约 3 个小时。从 Compass 1.0.alpha19
开始,要求是 rvm 版本 1.9.3。
有几个未收集的帖子,但对我有用的是以下内容:
sudo gem uninstall sass
sudo gem uninstall compass
rvm install ruby-1.9.3-p448
sudo gem install sass --pre
sudo gem install compass --pre
然后就做到了。希望它也适用于您!
【讨论】:
我最近遇到了同样的问题,但版本更新了。我所做的是卸载我之前使用 aptitude 安装的 ruby 版本,然后按照rvm.io/rvm/install 的说明再次安装它。使用正确构建的新 ruby/rvm 版本指南针。 感谢您,非常有帮助。我将第 3 步更改为rvm install ruby-2.1.2
,因为 1.9.3 不再更新【参考方案6】:
为了解决这个问题,我必须确保我拥有最新版本的 Ruby 和 gems gem update --system
;然后,我必须确保安装了 Xcode 和命令行工具:xcode-select --install
。
【讨论】:
xcode-select --install
已完成,但这并不能解决我的问题【参考方案7】:
在 Mac OS 上,您需要安装此功能!
xcode-select --install
【讨论】:
macOS 11.2 BigSur 尝试安装sudo gem install compass
时出现 OP 错误。安装 xcode 修复了它,我终于可以安装指南针了。非常感谢!【参考方案8】:
嗨,让它在 Mac 上运行是一个挑战,所以无论如何这里有一个解决方案
-
安装macports
安装rvm
重启终端
运行
rvm requirements
然后运行rvm install 2.1
最后一步运行gem install compass --pre
我不确定,但 Mavericks 上的 ruby 版本不支持本机扩展等...所以如果您像我所做的“2.1”那样指向其他 ruby 版本,它可以正常工作。
【讨论】:
我建议不要使用 macports。【参考方案9】:如果你使用的是 Ubuntu,你应该尝试安装 build-essential
apt install build-essential
我在全新安装 ubuntu 时遇到了 gems 安装问题,这个解决方案对我有用。
【讨论】:
我遇到了同样的问题。应该有更多的人对此表示赞同。 这就是我的答案。【参考方案10】:不知道为什么这些都没有被标记为正确答案,但我通过谷歌搜索来到这里,所以我会传递我所知道的......
@paul_g 的方法对我来说非常接近,我在 Mac osx10.9 Retina 上的步骤:
安装 macports 安装 rvm(使用 ruby 稳定添加--insecure
标志以解决 SSL 相关问题)$\curl -sSL --insecure https://get.rvm.io | bash -s stable --ruby
重启终端/资源配置文件
运行 rvm requirements --with-gcc=clang
您无需更新 Ruby,因为您下载了最新的稳定版本
最后一步运行gem install compass --pre
【讨论】:
【参考方案11】:您可能需要安装 Apple 的命令行工具,默认情况下您的系统上可能没有安装这些工具。我遇到了同样的错误,但是在按照此处的任何说明进行操作之前,我安装了命令行工具(由于一个不相关的问题),并且当我再次尝试时,您会发现 compass 安装没有问题。 YMMV。
【讨论】:
这为我解决了上述问题,所以我会说这是上述问题的可接受答案。【参考方案12】:为了在 Yosemite 上安装 Compass,您需要设置 Ruby 环境并安装 Xcode 命令行工具。 但是,最重要的是,更新 Xcode 后,一定要启动 Xcode 应用程序并接受 Apple 许可条款。它将完成组件的安装。 之后,您可以安装 Compass: sudo gem install compass
【讨论】:
【参考方案13】:对于 Mac 操作系统:
我的错误是我在安装新的 XCode 后忘记在 XCode - 首选项 - 位置 - 命令行工具中选择选项(我有 2 个版本,后来我删除了一个)。也许它会帮助某人。
【讨论】:
【参考方案14】:对于 macOS 10.14 Mojave,请确保您已经通过 xcode-select --install
安装了命令行工具并运行以下命令来安装 std 标头。
sudo open /Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg
现在再次尝试您的命令。
【讨论】:
【参考方案15】:sudo gem update --system
sudo gem install compass
【讨论】:
【参考方案16】:你必须有 gcc,json_pure
我从几个帖子中收集了一些信息
sudo gem uninstall sass
sudo gem uninstall compass
sudo gem update --system
gem install json_pure (if you have already have continued to next step)
sudo yum install gcc gcc-c++ (if you have already have continued to next step)
sudo gem install sass
sudo gem install compass
嗨,如果 ** sudo gem update --system ** 不工作你在更新中遇到错误,然后使用
sudo gem 更新 --system 2.7.8
【讨论】:
由于这个错误,在安装指南针之前,我还必须为 Fedora 24 运行sudo yum install -y redhat-rpm-config
:gcc: error: /usr/lib/rpm/redhat/redhat-hardened-cc1: No such file or directory
sudo gem update --system
给了我错误:ERROR: While executing gem ... (Errno::EPERM) Operation not permitted @ rb_sysopen - System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/bin/gem
:(【参考方案17】:
在优胜美地,您所要做的就是安装命令行工具。然后就可以了。
即使其他 gem 安装良好。您必须运行 xcode-select --install 才能使 gem install compass 工作。
祝你好运。
【讨论】:
【参考方案18】:在 Mac OS X 10.9 上,如果您尝试xcode-select --install
,您将收到以下错误:
无法安装该软件,因为它目前无法从 软件更新服务器。
解决办法是直接从苹果官网下载命令行工具(OS X 10.9):https://developer.apple.com/downloads/index.action?name=for%20Xcode%20-
然后您将能够安装最新版本的命令行工具。
【讨论】:
【参考方案19】:ubuntu 14.04,执行apt-get install rubygems,出现错误
E: 包 'rubygems' 没有安装候选
按照命令解决问题。
sudo apt-get install gcc ruby-devel rubygems-integration ruby-compass
【讨论】:
【参考方案20】:试试brew install coreutils
。
我在重建一个老化的 sass/compass 项目时遇到了这个问题,该项目最近由一位同事更新到 ruby 2.2.5。该项目使用 rvm 和 bundler。这些是我的命令
$ rvm install ruby-2.2.5
$ rvm use ruby-2.2.5
$ gem install bundler
$ bundle install
这导致我遇到了著名的ffi
安装错误,这些错误是在 *** 环境中报告的:
An error occurred while installing ffi (1.9.14), and Bundler cannot continue.
解决这个问题的大多数建议是安装 Xcode 命令行工具。但是,这已经安装在我的环境中:
$ xcode-select -p
/Library/Developer/CommandLineTools
其他建议说要安装 gcc...所以我尝试了:
$ brew install gcc46
但这也因分段错误而失败...¯\_(ツ)_/¯
。
然后,我尝试手动安装 compass,看看它是否会给出相同的 ffi
错误:
$ gem install compass
但令我惊讶的是,我得到了一个完全不同的错误:
make: /usr/local/bin/gmkdir: No such file or directory
于是我搜索了那个问题,发现this ancient blog post说要安装coreutils:
$ brew install coreutils
使用 Homebrew 安装 coreutils
后,bundler 能够成功完成并安装 compass 和依赖项。
结局。
【讨论】:
【参考方案21】:当
gem 安装过度使用
也运行此错误已放置在终端中。
Failed to build gem native extension
请也这样做
xcode-select --install
它也会解决这个问题
【讨论】:
我收到xcode-select: error: command line tools are already installed, use "Software Update" to install updates
。这并不能解决问题。【参考方案22】:
试试这个,然后再尝试安装指南针
sudo apt install ruby-full
【讨论】:
【参考方案23】:我在 Linux Mint 上遇到了同样的问题,但我能够通过卸载 ruby 并重新安装来解决它。
卸载 ruby:
sudo apt-get remove ruby
它报告了一些 ruby 包,例如:
Package 'ruby' is not installed, so not removed
The following packages were automatically installed and are no longer required:
libruby2.2 ruby-chunky-png ruby-sass rubygems-integration
Use 'apt-get autoremove' to remove them.
卸载剩余的软件包*
apt-get autoremove
再次安装 ruby
sudo apt-get install ruby2.2
安装指南针
sudo gem install compass
最后一条命令执行成功。
【讨论】:
【参考方案24】:在 Mac 上安装 Ruby gem 是一个常见的困惑和挫折来源。不幸的是,大多数解决方案都是不完整的、过时的,并且提供了不好的建议。这里得票最多的答案是使用sudo
,你永远不需要这样做,尤其是如果你不明白它的作用。
错误“无法构建gem原生扩展”是由于未安装Apple命令行工具所致,这是正确的。但是,安装它们并不一定会为您提供合适的 Ruby 环境。一个有效的 Ruby 设置有 5 个步骤,我已经在我的definitive guide to installing Ruby gems on a Mac 中详细介绍了这些步骤。它解释了您收到此错误的原因,比较了各种解决方案,为什么有些解决方案比其他解决方案更好,以及为什么您不应该使用 sudo
。
TL;DR:使用经过实战考验且可靠的自动化脚本,为您设置一切:https://github.com/monfresh/laptop
【讨论】:
以上是关于无法构建 gem 原生扩展(安装 Compass)的主要内容,如果未能解决你的问题,请参考以下文章
在 OSX 上安装 rmagick gem 时出错 - 错误:无法构建 gem 原生扩展