安装json gem'mkmf.rb时出错无法找到ruby的头文件'

Nav*_*eet 347 ruby json rubygems

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

sudo gem install --http-proxy <host address>:<port> json
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

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
Run Code Online (Sandbox Code Playgroud)

由于我不确定问题是什么,我用Google搜索并找到了这些

任何提示?谢谢!

Ale*_*kin 716

现代时代更新,如mimoralea所述:

如果您使用的是ruby 2.0或2.2(感谢@ patrick-davey).

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
Run Code Online (Sandbox Code Playgroud)

或者,通用方式:

sudo apt-get install ruby`ruby -e 'puts RUBY_VERSION[/\d+\.\d+/]'`-dev
Run Code Online (Sandbox Code Playgroud)

您发布的第一个环节是完全相同的情况:没有安装Ruby开发环境.编译ruby扩展需要开发环境,这些扩展主要是编写的C.代理与问题无关:一切都下载得很好,只是编译失败.

我建议你安装ruby-dev(ruby-devel基于rpm的发行版)包到你的目标机器上.gcc也可能需要包裹.

尝试:

$ sudo apt-get install ruby-dev
Run Code Online (Sandbox Code Playgroud)

或者,对于Redhat发行版:

$ sudo yum install ruby-devel
Run Code Online (Sandbox Code Playgroud)

或者,对于[open] SuSE:

$ sudo zypper install ruby-devel
Run Code Online (Sandbox Code Playgroud)

  • 安装ruby-devel后(在Fedora 20上),我收到错误***extconf.rb失败***.按照你的建议安装gcc后,一切正常. (8认同)
  • 谢谢!我的意思是这个问题的答案似乎是特定于模块的。我认为不是ruby-dev而是ruby-devel。在这里,我找到了我真正需要的东西-https://www.digitalocean.com/community/articles/how-to-install-ruby-on-rails-on-centos-6 (2认同)
  • 不,这个答案无助于解决任何问题。正确的答案是[mimoralea提出的答案](http://stackoverflow.com/a/26225468/2066215)。 (2认同)
  • 我注意到在 debian 上我还必须安装 gcc 并 make (2认同)

mim*_*lea 74

如果您使用的是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
Run Code Online (Sandbox Code Playgroud)

而你在这里得到的模式......

  • 或者,如果你使用2.2 ...`sudo apt-get install ruby​​2.2-dev` (6认同)
  • 如果您使用的是旧版本的Ubuntu,例如Trusty(14.04),请为Ruby添加brightbox PPA:`sudo apt-add-repository -y ppa:brightbox/ruby​​-ng && sudo apt-get update && sudo apt- get install -y ruby​​2.2-dev` (2认同)

jok*_*oki 40

对于macOS 10.14上的Xcode 11,即使在安装Xcode和安装命令行工具并通过以下方式接受许可后,也会发生这种情况:

sudo xcode-select --install
sudo xcodebuild -license accept
Run Code Online (Sandbox Code Playgroud)

问题是Xcode 11附带了macOS 10.15 SDK,其中包含ruby2.6的标头,但不包含macOS 10.14的ruby2.3的标头。您可以通过运行来验证这是您的问题

ruby -rrbconfig -e 'puts RbConfig::CONFIG["rubyhdrdir"]'
Run Code Online (Sandbox Code Playgroud)

在具有Xcode 11的macOS 10.14上显示不存在的路径

/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
Run Code Online (Sandbox Code Playgroud)

但是,Xcode 11在中安装了macOS 10.14 SDK /Library/Developer/CommandLineTools/SDKs/MacOS10.14.sdk。不必按照其他答案中的建议安装旧的头文件来污染系统目录。相反,通过选择该SDK,将找到适当的ruby2.3标头:

sudo xcode-select --switch /Library/Developer/CommandLineTools
ruby -rrbconfig -e 'puts RbConfig::CONFIG["rubyhdrdir"]'
Run Code Online (Sandbox Code Playgroud)

现在应该可以正确打印

/Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0
Run Code Online (Sandbox Code Playgroud)

同样,gem install应该在选择该SDK时起作用。

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

sudo xcode-select --switch /Applications/Xcode.app
Run Code Online (Sandbox Code Playgroud)

  • 传奇。正是我在 10.14.6 上遇到的问题。悲伤不能投两次票。 (28认同)
  • 先生,您是一位不起眼的知识霸主。非常感谢, (6认同)
  • 总传奇 (3认同)
  • 你这个该死的编码传奇人物。 (2认同)

Jua*_*tas 22

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

sudo apt-get install ruby2.3-dev
Run Code Online (Sandbox Code Playgroud)


小智 15

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

sudo xcode-select --install
Run Code Online (Sandbox Code Playgroud)

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

sudo xcodebuild -license
Run Code Online (Sandbox Code Playgroud)


小智 11

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

$ gem install rerun
Run Code Online (Sandbox Code Playgroud)

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

  • 红宝石devel的
  • libffi-devel的
  • GCC核心
  • GCC-克++
  • 使
  • automake1.15


Mil*_*vis 11

大多数投票解决方案都无法在我的机器上运行(linux mint 18.04).仔细观察后,我发现g ++丢失了.解决了

sudo apt-get install g ++

  • 这在 Ubuntu 18.04 上对我有用。在 g++ install 工作之前,我还必须执行 sudo apt-get install make。 (2认同)

小智 9

如果您使用SUSE

sudo yast2 -i ruby-devel
Run Code Online (Sandbox Code Playgroud)

  • 我更喜欢 ruby​​-devel 中的 sudo zypper。 (2认同)

Aar*_*ger 8

Xcode 11 / macOS Catalina

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

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

/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include
Run Code Online (Sandbox Code Playgroud)

该目录的大部分内容可以通过使用xcrun --show-sdk-path. 并且如果您将此路径添加到CPATH环境变量中,那么构建脚本(包括那些调用 via 的脚本bundle)通常能够找到它。

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

export CPATH="$(xcrun --show-sdk-path)/usr/include"
Run Code Online (Sandbox Code Playgroud)

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

构建到非 macOS 平台的注意事项

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

CPATH="" xcodebuild --some-args
Run Code Online (Sandbox Code Playgroud)

  • 你有关于 CPATH 的文档吗?设置它并不能解决我的问题。当我首先检查它的值时,它似乎未定义。 (2认同)

emm*_*ojo 5

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

dnf install ruby-devel
Run Code Online (Sandbox Code Playgroud)


Sha*_*zon 5

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

open /Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg
Run Code Online (Sandbox Code Playgroud)

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