安装json gem 'mkmf时出错。Rb不能'

作为上下文,它位于具有防火墙的远程服务器上。我正在通过代理设置环境。我有ruby 1.8.7。当我尝试gem安装..

sudo gem install --http-proxy <host address>:<port> json

我得到以下错误:

Building native extensions.  This could take a while...
ERROR:  Error installing json:
ERROR: Failed to build gem native extension.


/usr/bin/ruby extconf.rb
mkmf.rb can't find header files for ruby at /usr/lib/ruby/ruby.h


Gem files will remain installed in /usr/lib64/ruby/gems/1.8/gems/json-1.8.1 for inspection.
Results logged to /usr/lib64/ruby/gems/1.8/gems/json-1.8.1/ext/json/ext/generator/gem_make.out

因为我不确定是什么问题,我谷歌了一下,找到了这些

有提示吗?谢谢!

301454 次浏览

现代更新,如由mimoralea陈述:

如果你正在使用ruby 2.0或2.2(谢谢@patrick-davey)。

sudo apt-get install ruby2.0-dev
sudo apt-get install ruby2.2-dev
sudo apt-get install ruby2.3-dev

或者,一般来说:

sudo apt-get install ruby-dev

sudo apt-get install ruby`ruby -e 'puts RUBY_VERSION[/\d+\.\d+/]'`-dev

你发布的第一个链接是完全你的案例:没有安装ruby开发环境。需要开发环境来编译ruby扩展,这些扩展大多是用C编写的。代理与此问题无关:下载一切正常,只是编译失败。

我建议你在你的目标机器上安装ruby-dev(基于rpm的发行版的ruby-devel)包。

gcc包可能也需要。

试一试:

$ sudo apt-get install ruby-dev

或者,对于Redhat发行版:

$ sudo yum install ruby-devel

或者,对于[open]SuSE:

$ sudo zypper install ruby-devel

如果您使用SUSE操作系统

sudo yast2 -i ruby-devel

如果你正在使用ruby 2.0或2.2(感谢@patrick-davey)或2.3(感谢@juanitofatas)。

sudo apt-get install ruby-dev
sudo apt-get install ruby2.0-dev
sudo apt-get install ruby2.2-dev
sudo apt-get install ruby2.3-dev

你在这里得到了模式。

在Fedora 21及更高版本中,只需打开一个终端,以根用户身份安装Ruby Development文件。

dnf install ruby-devel

我也遇到过这个问题,因为我通过brightbox在Ubuntu上安装Ruby,我认为ruby-dev是ruby的主干。所以我没有安装。安装ruby2.3-dev修复它:

sudo apt-get install ruby2.3-dev

我在使用cygwin运行以下命令时遇到了类似的问题:

$ gem install rerun

我通过安装以下cygwin包来解决这个问题:

  • ruby-devel
  • libffi-devel
  • gcc核心
  • gcc-g + +
  • 使
  • automake1.15

安装ruby-devel后,可能需要安装gcc

对于那些在Mac OS X上得到这个的人,你可能需要运行以下命令来安装XCode命令行工具,即使你已经安装了XCode:

sudo xcode-select --install

此外,您必须通过运行以下命令来同意XCode的条款和条件:

sudo xcodebuild -license
大多数投票的解决方案在我的机器上不起作用(linux mint 18.04)。 仔细一看,我发现g++不见了。 用

解决

Sudo apt-get安装g++

Xcode 11 / macOS Catalina

在Xcode 11 / macOS Catalina上,头文件不再位于旧位置,旧的/Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg文件不再可用。

相反,头文件现在被安装到当前SDK路径的/usr/include目录:

/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include

通过使用xcrun --show-sdk-path的输出可以找到这个目录的大部分内容。如果将此路径添加到CPATH环境变量中,则构建脚本(包括通过bundle调用的脚本)通常能够找到它。

我通过在.zshrc文件中设置CPATH来解决这个问题:

export CPATH="$(xcrun --show-sdk-path)/usr/include"

在打开一个新的shell(或运行source .zshrc)后,我不再收到错误消息mkmf。Rb无法在/usr/lib/ruby/ruby.h找到ruby的头文件, rubygems安装正确。

注意构建到非macos平台

如果构建到非macOS平台,如iOS/tvOS/watchOS,此更改将尝试在这些平台中包含macOS SDK,从而导致构建错误。要解决这个问题,要么在登录时不设置CPATH环境变量,要么在运行xcodebuild时临时将其设置为空白,如下所示:

CPATH="" xcodebuild --some-args

对于macOS 10.14上的Xcode 11,即使在安装Xcode和安装命令行工具并接受许可证之后,这种情况也会发生

sudo xcode-select --install
sudo xcodebuild -license accept

问题是Xcode 11发布了macOS 10.15 SDK,其中包括ruby2.6的头文件,但不包括macOS 10.14的ruby2.3。你可以通过运行来验证这就是你的问题所在

ruby -rrbconfig -e 'puts RbConfig::CONFIG["rubyhdrdir"]'

在macOS 10.14和Xcode 11上打印不存在路径

/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.15.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0

然而,Xcode 11在/Library/Developer/CommandLineTools/SDKs/MacOS10.14.sdk中安装了macOS 10.14 SDK。没有必要像其他回答中建议的那样通过安装旧的头文件来污染系统目录。相反,通过选择该SDK,将找到合适的ruby2.3头文件:

sudo xcode-select --switch /Library/Developer/CommandLineTools
ruby -rrbconfig -e 'puts RbConfig::CONFIG["rubyhdrdir"]'

现在应该正确打印了

/Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0

同样地,gem install应该在选择该SDK时工作。

要切换回当前的Xcode SDK,使用

sudo xcode-select --switch /Applications/Xcode.app

您需要安装整个ruby,而不仅仅是最小的包。正确的命令是:

sudo apt install ruby-full

下面的命令也不会安装一个完整的ruby:

sudo apt-get install ruby2.3-dev
sudo apt-get --reinstall install ruby

试试ubuntu 16.04

Xcode ->偏好->位置

将命令行工具更改为Xcode 11.2.1

对于Ubuntu 18,在安装时检查日志文件

结果记录到/var/canvas/vendor/bundle/ruby/2.5.0/extensions/x86_64-linux/2.5.0/nio4r-2.5.2/gem_make.out

less /var/canvas/vendor/bundle/ruby/2.5.0/extensions/x86_64-linux/2.5.0/nio4r-2.5.2/gem_make.out

我注意到make没有找到。所以安装由

sudo apt-get install make

一切工作。

在Mac 10.14上,头文件似乎没有安装在正确的位置。而不是像其他修复一样改变路径,我能够运行这个:

open /Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg

按照说明,它为我解决了这个问题。

我在macOS 10.15和cocoapods的Xcode 12上遇到了类似的问题。只需确保xcode-select命令指向要构建的SDK。它应该在构建之后没有任何问题。

之前你按照Joki的回答(下面)和如果的提示:

  • 你有MacOS 10.14.6

  • at /Library/Developer/CommandLineTools/ sdk /你有文件夹 MacOSX10.14 MacOSX.sdk(象征性的)。sdk, MacOSX10.15.sdk < / p >

  • < p > MacOSX10.15移动。SDK到任何地方(需要管理特权)

  • 删除符号链接(需要管理员权限)

  • 在/Library/Developer/CommandLineTools/ sdk /下创建另一个到MacOSX10.14的符号链接。SDK文件夹使用(需要管理权限)

    sudo ln -s /Library/Developer/CommandLineTools/ sdk /MacOSX10.14.使用实例sdk MacOSX.sdk

  • < p > 现在你可以跟着Joki的答案走了

< >强警告! 如果你移动MacOSX10.15。sdk文件夹到/Library/Developer/CommandLineTools/ sdk /再次,命令

. sdk
ruby -rrbconfig -e 'puts RbConfig::CONFIG["rubyhdrdir"]'

将显示MacOSX10.15。sdk文件夹像默认再次,现在我不知道如何修复它!我的建议,压缩文件夹,并把原来的文件夹,直到修复将可用。

macOS RubyMine Gem安装失败

当我试图通过RubyMine安装Gem时,我遇到了这个错误消息。它不喜欢我用rbenv改变了全局Ruby版本,所以我通过更改回系统默认Ruby版本来修复它:

rbenv global system

重启了RubyMine。